我在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
}
答案 0 :(得分:3)
要检索对象的运行时属性,请使用System.ComponentModel.TypeDescriptor.GetProperties()
方法,而不是Type.GetProperties()
方法,该方法仅检索type
的编译时属性。