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

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

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

这真的取决于你想要完成什么。

System.ComponentModel.TypeDescriptor的东西可以用来添加属性类型,属性和对象实例,它也有限制,你必须使用它来检索这些属性。 如果你正在编写使用这些属性的代码,并且可以在这些限制之内生存,那么我肯定会提出这样的建议。

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

那么,为了不同,我找到了一篇引用了Reflection.Emit的文章。

这里是链接: http : //www.codeproject.com/KB/cs/dotnetattributes.aspx ,你也想看看文章底部的一些评论,因为讨论了可能的方法。

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

不,这不对。

属性是元数据,并以二进制形式存储在已编译的程序集中(这也是为什么您只能使用简单的类型)。

我不这么认为。 即使我错了,最好的希望是将它们添加到整个类型,而不是一个类型的实例

如果你需要能够动态添加的东西,c#属性不是这样。 考虑将数据存储在xml中。 我最近做了一个项目,我开始w /属性,但最终移动到序列化w / xml。

你为什么需要? 属性为反射提供了额外的信息,但如果你从外部知道你想要的属性,则不需要它们。

您可以在外部相对容易地将元数据存储在数据库或资源文件中。

我非常努力地使用System.ComponentModel.TypeDescriptor而没有成功。 这并不意味着它不能工作,但我想看到代码。

在柜台部分,我想改变一些属性值。 我做了两个功能,为此目的正常工作。

  // ************************************************************************ public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description) { PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute; if (att != null) { var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance); if (fieldDescription != null) { fieldDescription.SetValue(att, description); } } } // ************************************************************************ public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly) { PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute; if (att != null) { var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); if (fieldDescription != null) { fieldDescription.SetValue(att, isReadOnly); } } } 

在Java中,我曾经通过使用映射并实现我自己的Key-Value编码来解决这个问题。

http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html