Answers:
这实际上取决于您要实现的目标。
该System.ComponentModel.TypeDescriptor东西可以用来添加属性类型,属性和对象实例,它有,你必须用它来读取这些属性以及限制。如果您正在编写使用这些属性的代码,并且可以在这些限制内生存,那么我绝对会建议这样做。
据我所知,PropertyGrid控件和Visual Studio设计图面是BCL中唯一消耗TypeDescriptor内容的东西。实际上,这就是他们实际需要做的事情的一半。
TypeDescriptor
以及TypeDescriptionProvider
未实现?
[Attr(1), Attr(2), Attr(3)]
仅Ex Attr(3)
。
好吧,只是有所不同,我找到了一篇使用Reflection.Emit引用的文章。
这是链接:http : //www.codeproject.com/KB/cs/dotnetattributes.aspx,由于可能的方法已在讨论中,因此您还将希望查看本文底部的一些评论。
YourClass
化为YourRuntimeClassWithAttributes
。
YourClass
,则可以在运行时对其进行子类化,并生成一个名称稍有不同的相同类,该类也具有所需的动态创建的属性,而多态性将允许类型检查代码仍然识别您的基类。
我不相信 即使我错了,您最好的期望就是将它们添加到整个Type中,而不是Type的实例中。
如果您需要能够动态添加的内容,则不能使用c#属性。研究将数据存储在xml中。我最近做了一个项目,该项目以属性开始,但最终转移到以xml进行序列化。
为什么需要 属性为反射提供了额外的信息,但是如果您从外部知道想要的属性,则不需要它们。
您可以相对容易地在外部将元数据存储在数据库或资源文件中。
我非常尝试使用System.ComponentModel.TypeDescriptor,但没有成功。那并不意味着它不能工作,但是我想看看它的代码。
相反,我想更改一些属性值。我做了2个功能,可以达到这个目的。
// ************************************************************************
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中,我过去通过使用映射并实现自己的键值编码来解决此问题。
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
TypeDescriptor
-不只是PropertyGrid
。