获取对象实例上自定义属性的*值*?
使用 .NET 4、C#
假设我有一个扩展 CustomTypeDescriptor
的 Info
类。 Info
类的实例有一个
对的字典,在运行时加载。
我希望能够将字典键公开为属性(以便 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)
,但根据我的理解,它希望我返回具有匹配的真实(编译)属性的另一个类型的实例。
我希望能够自己编写属性的实际实现(对于本例,返回字典中键与属性名称匹配的值)。
这可能吗?
Using .NET 4, C#
Let's say I have class Info
that extends CustomTypeDescriptor
. An instance of class Info
has a dictionary of <string, object>
pairs, loaded at runtime.
I'd like to be able to expose the dictionary keys as properties (so that each instance of Info
has different properties). The values of the properties should be the corresponding values in the dictionary.
I got around to exposing properties:
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());
}
The problem is, how do I get their values?
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
The only way I found to get control when prop.GetValue()
is called was to override GetPropertyOwner(PropertyDescriptor pd)
, but the way I understand it, it expects me to return the instance of another type that has a matching real (compiled) property.
I'd like to be able to write the actual implementation of the property myself (for this example, return the value in the dictionary whose key matches the property name).
Is this possible?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要自己实现
PropertyDescriptor
类并重写GetValue
方法。因此,您将使用 newMyCoolPropertyDescriptor(dictionary, kvp.Key)
或类似内容,而不是TypeDescriptor.CreateProperty
。以下是如何实施的示例:
You need to make your own implementation of the
PropertyDescriptor
class overridingGetValue
method. So instead ofTypeDescriptor.CreateProperty
you'll use newMyCoolPropertyDescriptor(dictionary, kvp.Key)
or like.Here is a sample of how it can be implemented:
我对 CustomTypeDescriptor 的理解是,它允许数据绑定向(例如,网格)公开类中实际不存在的额外属性。它不是扩展 CLR 以便您的实际类公开该属性的东西。
如果您想要实际的 CLR 属性,那么您需要查看
DynamicObject
或ExpandoObject
以获得我认为您想要的功能。My understanding of
CustomTypeDescriptor
is that it allows databinding to expose extra properties to, say, a grid, that don't actually exist on the class. It's not something that extends the CLR so that your actual class exposes the property.If you want actual CLR properties then you need to look at
DynamicObject
orExpandoObject
to get the kind of functionality that I think you're after.