解决方案 »

  1.   

    说点具体的,比如你想通过反射创建类,希望这些类能定义一个不同于类名的名字,然后通过名字来查找并创建对应的类。一般有三种方案:
    1. 这些类实现一个Name属性,返回名字;
    2. 通过代码或者配置文件写一个字典,把名字和类对应起来;
    3. 用自定义的attribute对类标注名字。第1种必须先创建了类,才能调用Name返回名字(当然写成静态的可以避免先创建,不过会导致静态构造的调用和继承时候的麻烦),很多时候不可接受。第2种需要写一个额外的机制来"注册"这些类。而第三种通过attribute的标注实现了"自注册",反射找到拥有标注了需要的名字的类,创建它就可以了。像MVC框架通过url查找Controller和Action都是这么一个过程。默认可以不用attribute,直接通过类名/方法名判断,但是需要的时候都是可以用attribute来定义这个映射。再比如,EF框架对数据库映射实体的时候,定义主键、外键、字段的类型、约束等等都可以通过attribute在实体上定义。这可以让人一目了然,看到实体和数据库表的对应关系。还有,序列化/反序列化数据的时候,可以通过attribute告诉序列化框架对应的类型/属性该如何处理。比如定义映射到数据的名字、默认值、日期值如何处理等等。总之,attribute可以用离目标最近的方式,给目标附加一些运行时可以获取到的信息。程序就可以根据需要利用这些信息来控制行为。
      

  2.   

    可以看看这个http://www.w3cschool.cc/csharp/csharp-attribute.html,有例子