反射和属性使用的资源

时间:2009-09-28 15:54:43

标签: c# reflection attributes

是否有任何好的资源可以解释属性和反射以及它们的深入用途?

我对最佳实践特别感兴趣,即使用属性和反射来解决特定计算问题是有用或适当的。

3 个答案:

答案 0 :(得分:3)

我不知道一个很好的综合资源。根据我的经验,最好的学习方法是遇到没有它就无法解决的情况(至少不容易)。所以,如果你知道反思的基本情况和属性使事情变得更容易,你知道何时需要开始学习它们。

反思适合在没有它的情况下无法满足需要的时候。

我知道这听起来有点讽刺,但事实确实如此 - 如果你需要编写一些代码,但只有无法来计算你正在处理的对象的类型,反思是恰当的。当你需要潜入并使用你无法控制的对象的私人/受保护/内部成员时,它也是合适的。

当您需要添加有关类型的额外信息时,

属性是合适的。

示例:我有一堆IConverter个类。每个对应于我们的内容管理系统中的特定字段。如何使用描述其所用字段的额外信息来装饰此类?

  • 我可以为每个转换器创建一个不同的界面,即使它们都做同样的事情,但这似乎是一个坏主意。
  • 我可以将一个只读属性放回每个类的字段名称,但是我必须创建每个类的实例来检查属性值。

如果我可以在课堂上放置一些额外的信息来说明它是什么字段,那就太好了。然后我可以查看我的所有类型并找到我想要的那个,然后实例化那个。属性让我这样做:

[HandlesField("FieldName")]
public class FooFieldConverter : IConverter

答案 1 :(得分:1)

我认为没有任何一般资源能够满足您的需求。总的来说,属性只是向代码添加元数据的一种方式,而不会改变代码的行为。就其本身而言,属性不会做任何事情。属性允许您将代码插入其他内容,而其他东西可以利用其他元数据来提供改进的功能。

一些很好的例子是Visual Studio Design Surface和WCF。使用[描述],[类别]等属性实际上不会对您的代码执行任何操作......但它们确实让Visual Studio设计器正确显示和组织您的对象。类似地,[ServiceContract],[OperationContract],[DataContract],[DataMember]和其他WCF属性不会使您的代码成为Web服务......它们只是使您可以将代码插入WCF,其中转向使它成为一个Web服务。

属性是元数据注入机制,仅此而已。使用元数据的其他程序,框架或实用程序赋予属性真正的能力。关于何时使用属性,实际上没有任何“最佳实践”。它们只是一种工具。它们使您能够使用有用的信息注释代码,并在其他地方使用该信息。关键是知道何时需要额外的元数据......这是非常主观的...只有设计项目架构的人才能确定是否需要新的自定义属性。

如果您有一个特定的场景,您认为自己需要属性,请通过示例更新您的答案,我会看到我可以提供的其他帮助。

答案 2 :(得分:0)

以下文章是一本很好的入门书:

使用自定义属性进行设计
http://msdn.microsoft.com/en-us/magazine/cc163802.aspx