作为一个实体类,我想在运行时添加一个属性,我该怎么办?
答案 0 :(得分:10)
需要查看哪些属性?如果是数据绑定等问题,TypeDescriptor
应该有效:
TypeDescriptor.AddAttributes(type, attribs);
TypeDescriptor.AddAttributes(instance, attribs);
这仅影响System.ComponentModel
使用情况(不是直接反映),但这通常就足够了 - 例如,您可以通过上述内容关联TypeConverter
。
如果“属性”是指“属性”,那么(同样,就数据绑定而言)TypeDescriptor
也有潜力 - 但它是非平凡的;您需要在对象上实现ICustomTypeDescriptor
,或者为类型编写CustomTypeDescriptor
- 在任何一种情况下,您都需要编写自己的PropertyDescriptor
实现(通常与每个人交谈) - 实例字典等)。这将被使用的任何东西使用:
// only works if you use TypeDescriptionProvider
PropertyDescriptorCollection typeProps = TypeDescriptor.GetProperties(type);
// works via TypeDescriptionProvider or ICustomTypeDescriptor
PropertyDescriptorCollection objProps = TypeDescriptor.GetProperties(obj);
同样,这涵盖了广泛的数据绑定和类似场景。举个例子,see here - 然而,它远非微不足道。示例用法(来自链接)在运行时添加两个属性:
Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5));
Bag.AddProperty<string>("Name");
答案 1 :(得分:2)
编辑:请澄清,您是在谈论c# attributes还是您班上的成员?
添加c#属性的唯一方法是使用其他属性生成一个全新的类,编译并将新程序集加载到现有的AppDomain。
答案 2 :(得分:1)
使用哈希表来存储您的属性。
如果您想要更多的运行时灵活性,可以尝试Ruby或其他一些解释语言。
答案 3 :(得分:1)
看看动态语言运行时。您也可以考虑使用IronRuby或IronPython这样的动态语言。
你想解决什么问题?
答案 4 :(得分:0)
属性是类型的元数据的一部分,因此它们在编译的程序集中被硬编码(这也是为什么只允许使用某些基本类型而不是属性中的任意数据)。
结果是您无法在运行时向类型添加任何属性。但是有各种替代技术。您可以使用简单的词典或更强大的词典,如attached dependency properties。
答案 5 :(得分:0)
我会选择PostSharp,这是一个非常优雅AOP framework(或政策注入)。
PostSharp allows you to inject custom attributes。
在帖子中提到的博客条目中有一些代码可以下载以实现您的目标。
答案 6 :(得分:0)
这篇文章为我解答了这个问题: