C#:如何在运行时向对象添加属性?

时间:2009-02-19 01:11:01

标签: c# .net attributes

作为一个实体类,我想在运行时添加一个属性,我该怎么办?

7 个答案:

答案 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这样的动态语言。

你想解决什么问题?

http://en.wikipedia.org/wiki/Dynamic_Language_Runtime

答案 4 :(得分:0)

属性是类型的元数据的一部分,因此它们在编译的程序集中被硬编码(这也是为什么只允许使用某些基本类型而不是属性中的任意数据)。

结果是您无法在运行时向类型添加任何属性。但是有各种替代技术。您可以使用简单的词典或更强大的词典,如attached dependency properties

答案 5 :(得分:0)

我会选择PostSharp,这是一个非常优雅AOP framework(或政策注入)。

PostSharp allows you to inject custom attributes
在帖子中提到的博客条目中有一些代码可以下载以实现您的目标。

答案 6 :(得分:0)

这篇文章为我解答了这个问题:

Dynamically Creating Types at Runtime