是否有任何好的资源可以解释属性和反射以及它们的深入用途?
我对最佳实践特别感兴趣,即使用属性和反射来解决特定计算问题是有用或适当的。
答案 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