可以在C#中动态添加属性吗?
是否可以在运行时添加属性或者在运行时更改属性的值?
解决方案
我不相信即使我错了,我们最好的期望就是将它们添加到整个Type中,而不是Type的实例中。
不,这不对。
属性是元数据,并以二进制形式存储在已编译的程序集中(这也是为什么我们只能在它们中使用简单类型的原因)。
你不能一种解决方法是在运行时生成派生类并添加属性,尽管这可能有点过分。
属性是静态元数据。程序集,模块,类型,成员,参数和返回值不是C中的一流对象(例如,System.Type类只是类型的一种反映形式)。我们可以获取类型的属性的实例,并在属性可写的情况下更改它们,但不会影响该属性,因为该属性应用于该类型。
如果我们需要能够动态添加的内容,则无法采用分发方式。研究将数据存储在xml中。我最近做了一个项目,该项目开始时带有属性,但最终转移到了具有XML的序列化中。
你为什么要这样?属性为反射提供了额外的信息,但是如果我们从外部知道想要的属性,则不需要它们。
我们可以相对容易地在外部将元数据存储在数据库或者资源文件中。
这实际上取决于我们要实现的目标。
System.ComponentModel.TypeDescriptor内容可用于向类型,属性和对象实例添加属性,并且具有局限性,即必须使用它来检索这些属性。如果我们正在编写使用这些属性的代码,并且可以忍受这些限制,那么我绝对会建议我们这样做。
据我所知,PropertyGrid控件和Visual Studio设计图面是BCL中唯一消耗TypeDescriptor内容的东西。实际上,这就是他们实际需要做的事情的一半。
好吧,只是有所不同,我找到了一篇使用Reflection.Emit引用的文章。
这是链接:http://www.codeproject.com/KB/cs/dotnetattributes.aspx,由于可能的方法已在讨论中,因此我们还将希望查看本文底部的一些评论。
在Java中,我过去通过使用映射并在键值编码中实现自己的方法来解决此问题。
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html