什么是使用自定义属性的最简单、最优雅的方法?

6

有点小小的坦白,我从未写过属性类。我知道它们的作用是为类添加标志或额外功能。

能否给我一个快速的例子,不仅创建并应用属性到类中,而且还可以从另一段代码块中利用该属性。我所见过的利用任何形式的属性的代码样本都是使用反射,虽然我一直希望有一种不使用反射的方法来使用它们。

3个回答

12

属性(Attributes)总是与反射(reflection)一起使用。它们在编译时被嵌入到类型的元数据中,读取它们的唯一方式是通过反射。当您想要编写一个类型并希望将一些元数据与之关联,这些元数据可以被该类型的使用者使用时,就会使用属性。


好知道,谢谢这个,鉴于此,它们只是作为标志行为吗,无法赋予类本身任何功能?我一直想知道是否可以实际上创建一个属性,基本上向类添加方法,这些方法只能通过属性本身访问。 - Jimmy Hoffa
属性绝对无法修改或添加任何功能到类型本身。 - Darin Dimitrov
@Jimmy。是的,属性基本上是类上的花哨标志。此属性已过时。此类可序列化。此方法将从 IntelliSense 中隐藏。等等。属性不是用于添加功能的。 - Eric Lippert
2
实际上,有一些属性可以控制编译器的行为。例如 [Conditional] 属性可以完全隐藏一个方法。 - sukru

6

从另一个代码块使用属性的最简单、最优雅的方法是使用属性(property)而不是属性(attribute)

有关属性和属性之间差异的讨论,请参阅链接


+1,Eric你的博客文章真的给了我很大的启示,继续努力工作。 - Darin Dimitrov
这可能就是为什么我还没有真正编写和实现自定义属性的原因。 - Jimmy Hoffa
链接已失效 - 请前往Archive.org副本 这里 - spwert

5

首先创建您的属性

public class ImportableAttribute : 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说了之后,我怀疑我是否会真正使用它。 - Jimmy Hoffa
我经常使用它,主要用于验证(使用xVal),但也用于其他事情。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接