使用.NET 4,C#
假设我有类Info,它扩展了CustomTypeDescriptor。类Info的实例有一个<string, object>对字典,在运行时加载。
我希望能够将字典键公开为属性(这样每个Info实例都有不同的属性)。属性的值应该是字典中相应的值。
我有时间揭露自己的财产
public override PropertyDescriptorCollection GetProperties()
{
var orig = base.GetProperties();
var newProps = dictionary.Select( kvp =>
TypeDescriptor.CreateProperty(
this.GetType(),
kvp.key,
typeof(string)));
return new PropertyDescriptorCollection(
orig.Cast<PropertyDescriptor>()
.Concat(newProps)
.ToArray());
}问题是,我如何获得他们的价值观?
var info = new Info(new Dictionary<string, object>{{"some_property", 5}};
var prop = TypeDescriptor.GetProperties(i_info)["some_property"];
var val = prop.GetValue(i_info); //should return 5在调用prop.GetValue()时,我发现获得控制的唯一方法是重写GetPropertyOwner(PropertyDescriptor pd),但据我理解,它希望我返回另一个具有匹配的real (已编译)属性的类型的实例。
我希望能够自己编写该属性的实际实现(在本例中,返回键与属性名称匹配的字典中的值)。
这个是可能的吗?
发布于 2011-10-25 13:45:19
我对CustomTypeDescriptor的理解是,它允许绑定将额外的属性公开给(比如说,网格),这些属性实际上并不存在于类中。它不是扩展CLR从而使您的实际类公开属性的东西。
如果您想要实际的CLR属性,那么您需要查看DynamicObject或ExpandoObject,以获得我认为您需要的那种功能。
https://stackoverflow.com/questions/7889721
复制相似问题