Reflectionを使用して動的プロパティをクラスに追加しています。しかし、新しい/動的なプロパティを見つけることができません。.NET Reflection:動的プロパティを取得できません
プロセス:私はICustomTypeDescriptorインターフェイスを実装することによってDynamicClassを作成し、GetPropertiesIが、私は更新されたプロパティを取得するためにここに私のすべての操作をしましたが、それは動作していない機能を実装しています。..
マイDynamicClassコードはこちら:
public class DynamicClass : ICustomTypeDescriptor
{
// Collection to code add dynamic properties
/*
KeyedCollection<string, DynamicProperty> _properties;
public KeyedCollection<string, DynamicProperty> Properties
{
get;// { return _properties; }
set;// { _properties = value; }
}
*/
public void AddProperty(DynamicProperty _property)
{
PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
// Fill property collection with founded properties
PropertyDescriptorCollection propsCollection =
new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray());
propsCollection.Add(new DynamicPropertyDescriptor(
_property.ComponentType,
_property.PropertyName,
_property.PropertyType,
_property.Component,
_property.Value
));
}
public void AddProperties(KeyedCollection<string, DynamicProperty> _properties)
{
PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
// Fill property collection with founded properties
PropertyDescriptorCollection propsCollection =
new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray());
foreach (var p in _properties)
{
propsCollection.Add(new DynamicPropertyDescriptor(
p.ComponentType,
p.PropertyName,
p.PropertyType,
p.Component,
p.Value
));
}
}
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
{
PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
PropertyDescriptorCollection propsCollection =
new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray());
return propsCollection;
}
// ICustomTypeDescriptor implementation
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
{
// Properties founded within instance
PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
// Fill property collection with founded properties
PropertyDescriptorCollection propsCollection =
new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray());
//propsCollection.Cast.<CustomPropertyDescriptor>().Concat(Properties).ToArray();
// Fill property collection with dynamic properties (Properties)
//List<DynamicPropertyDescriptor> _dynamicPropertyDescriptors = new List<DynamicPropertyDescriptor>();
//instanceProps.Cast<DynamicPropertyDescriptor>().Concat().ToArray();
return propsCollection;
}
#region ICustomTypeDescriptor Members
public System.ComponentModel.AttributeCollection GetAttributes()
{
throw new NotImplementedException();
}
public string GetClassName()
{
throw new NotImplementedException();
}
public string GetComponentName()
{
throw new NotImplementedException();
}
public TypeConverter GetConverter()
{
throw new NotImplementedException();
}
public EventDescriptor GetDefaultEvent()
{
throw new NotImplementedException();
}
public PropertyDescriptor GetDefaultProperty()
{
throw new NotImplementedException();
}
public object GetEditor(Type editorBaseType)
{
throw new NotImplementedException();
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
throw new NotImplementedException();
}
public EventDescriptorCollection GetEvents()
{
throw new NotImplementedException();
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
PropertyDescriptorCollection propsCollection =
new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray());
return propsCollection;
/*
if (!this.DesignMode)
{
PropertyDescriptorCollection collection = TypeDescriptor.GetProperties(this, attributes, true);
PropertyDescriptorCollection newList = new PropertyDescriptorCollection(new PropertyDescriptor[0]);
foreach (PropertyDescriptor prop in collection)
{
Attribute a = prop.Attributes[typeof(CategoryAttribute)];
if (a != null && ((CategoryAttribute)a).Category == "SixDisciplines")
newList.Add(prop);
}
return newList;
}
else
//The control must be passed to the method.
return TypeDescriptor.GetProperties(this, attributes, true);
*/
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
throw new NotImplementedException();
}
#endregion
}
'GetProperties()'は、インスタンスではなく、コンパイル時に 'type'を反映します。だからあなたは新しい特性を見ていないのです。 –
どうすればいいですか? –
下記の私の答えを参照してください。 –