可以在C#中动态添加属性吗?

Jon*_*ner 140 .net c# attributes

是否可以在运行时添加属性或在运行时更改属性的值?

Ale*_*man 67

这实际上取决于你想要完成的目标.

System.ComponentModel.TypeDescriptor东西可以用来添加属性类型,属性和对象实例,它有,你必须用它来读取这些属性以及限制.如果您正在编写消耗这些属性的代码,并且您可以在这些限制内生存,那么我肯定会建议它.

据我所知,PropertyGrid控件和visual studio设计界面是BCL中唯一使用TypeDescriptor的东西.事实上,这就是他们如何处理他们真正需要做的事情的一半.

  • 实际上,大多数数据绑定使用`TypeDescriptor` - 而不仅仅是'PropertyGrid`. (7认同)

Mar*_*ade 66

属性是静态元数据.程序集,模块,类型,成员,参数和返回值不是C#中的第一类对象(例如,System.Type类只是类型的反映表示).您可以获取类型的属性实例,如果属性可写,则更改属性,但在应用于类型时不会影响属性.


pet*_* k. 11

你不能.一种解决方法可能是在运行时生成派生类并添加属性,尽管这可能有点过分.


tor*_*ial 10

好吧,为了与众不同,我发现了一篇引用Ref.Emit的文章.

这是链接:http://www.codeproject.com/KB/cs/dotnetattributes.aspx,您还需要查看本文底部的一些注释,因为讨论了可能的方法.

  • 请注意,您可以使用Reflection.Emit类在运行时创建属性,但是您可以将它们绑定到使用Emit包构建的类,而不是现有的类. (10认同)
  • @Hopeless,如果您想动态地将属性添加到现有的类“YourClass”中,您可以在运行时对其进行子类化,并生成一个名称略有不同的相同类,该类也具有所需的动态创建的属性,并且多态性将允许类型检查代码仍然可以识别您的基类。 (2认同)