gpt4 book ai didi

c# - .NET 反射 : Unable to retrieve Dynamic Properties

转载 作者:太空狗 更新时间:2023-10-29 23:33:41 26 4
gpt4 key购买 nike

我在反射的帮助下向类添加动态属性。但无法找到新的/动态属性。

过程:我通过实现 ICustomTypeDescriptor 接口(interface)创建了一个 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

最佳答案

要检索对象的运行时属性,请使用 System.ComponentModel.TypeDescriptor.GetProperties()方法,而不是 Type.GetProperties()方法,它只检索 type 的编译时属性。

关于c# - .NET 反射 : Unable to retrieve Dynamic Properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com