使用自定义属性最简单最优雅的方法是啥
Posted
技术标签:
【中文标题】使用自定义属性最简单最优雅的方法是啥【英文标题】:What's the simplest most elegant way to utilize a custom attribute使用自定义属性最简单最优雅的方法是什么 【发布时间】:2011-03-22 09:21:04 【问题描述】:所以有点忏悔,我从来没有写过属性类。我知道它们的目的是用标志或额外的功能装饰类。
谁能给我一个简单的例子,不仅可以创建属性并将其应用到类,还可以利用另一个代码块中的属性。我见过的唯一使用任何形式属性的代码示例是通过反射来实现的,尽管我一直希望有一种方法可以在没有反射的情况下使用它们。
【问题讨论】:
【参考方案1】:属性总是与反射一起使用。它们在编译期间被烘焙到类型的元数据中,读取它们的唯一方法是通过反射。当你想写一个类型并且你想将一些元数据与它相关联时使用属性,这些元数据可以被这种类型的消费者使用。
【讨论】:
很高兴知道,感谢这一点,考虑到,他们真的只是表现得像标志,无法为类本身赋予任何功能吗?我一直想知道您是否真的可以创建一个属性,该属性基本上将方法添加到只能通过属性本身访问的类中...... 属性绝对不能对类型本身进行修改或添加任何功能。 @吉米。是的,属性基本上是类上的花哨标志。此属性已过时。这个类是可序列化的。此方法将对 IntelliSense 隐藏。等等。属性不是用来添加功能的。 其实有一些属性可以控制编译器的行为。例如 [Conditional] 属性可能会完全隐藏一个方法。【参考方案2】:使用另一个代码块中的属性的最简单和最优雅的方法是使用属性而不是属性。
请参阅http://blogs.msdn.com/b/ericlippert/archive/2009/02/02/properties-vs-attributes.aspx,了解有关属性和属性之间差异的讨论。
【讨论】:
+1,Eric,您的博客文章对我来说是真正的灵感,请继续努力。 这可能就是为什么我还没有处于实际编写和实现自定义属性的位置.. 链接已失效 - Archive.org 副本 here.【参考方案3】:首先创建你的属性
public class ImportableAttribute : Attribute
然后是一个类,其中包含一个使用 Attribute 的项目
[ImportableAttribute]
public class ImportClass
[ImportableAttribute]
public string Item get; set;
然后检查该属性是否使用该属性。可以用类来完成..当然:)
PropertyInfo property = typeof(ImportClass).GetProperty("Item");
if (property.IsDefined(typeof(ImportableAttribute),true))
// do something
有一个类:
typeof(ImportClass).IsDefined(typeof(ImportableAttribute), true);
【讨论】:
谢谢,这看起来是一种非常简单的方法并回答了我的问题,尽管在 Eric 说完之后我怀疑我是否真的会使用它.. 我一直都在使用它,主要用于验证(使用 xVal)但也有其他用途。以上是关于使用自定义属性最简单最优雅的方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
检查 JavaScript 中是不是存在深度嵌套对象属性的最简单方法是啥? [复制]
从 HtmlHelper 的扩展方法中传递的 lambda 表达式中获取属性值的最简单方法是啥?