当前位置: 代码迷 >> C# >> 关于C#特征的疑惑
  详细解决方案

关于C#特征的疑惑

热度:74   发布时间:2016-05-05 04:51:36.0
关于C#特性的疑惑
一直很少接触特性,这两天也查了一下,但总觉得迷迷糊糊的。网上好多资料都表示特性实际上是一个能够编译的标识,或者说是能够编译的注释?是这样吗?还是没太明白特性的具体用途,求大神赐教了,能不能举个简单的例子解释下特性的用途。
------解决思路----------------------
你可以认为特性就是一些特殊的标志,给程序读的解释性语言,告诉程序它可以提供些什么,或者做些什么

如果解释不对或存在误导嫌疑,还请原谅……
------解决思路----------------------

------解决思路----------------------
说点具体的,比如你想通过反射创建类,希望这些类能定义一个不同于类名的名字,然后通过名字来查找并创建对应的类。一般有三种方案:
1. 这些类实现一个Name属性,返回名字;
2. 通过代码或者配置文件写一个字典,把名字和类对应起来;
3. 用自定义的attribute对类标注名字。

第1种必须先创建了类,才能调用Name返回名字(当然写成静态的可以避免先创建,不过会导致静态构造的调用和继承时候的麻烦),很多时候不可接受。第2种需要写一个额外的机制来"注册"这些类。而第三种通过attribute的标注实现了"自注册",反射找到拥有标注了需要的名字的类,创建它就可以了。

像MVC框架通过url查找Controller和Action都是这么一个过程。默认可以不用attribute,直接通过类名/方法名判断,但是需要的时候都是可以用attribute来定义这个映射。

再比如,EF框架对数据库映射实体的时候,定义主键、外键、字段的类型、约束等等都可以通过attribute在实体上定义。这可以让人一目了然,看到实体和数据库表的对应关系。

还有,序列化/反序列化数据的时候,可以通过attribute告诉序列化框架对应的类型/属性该如何处理。比如定义映射到数据的名字、默认值、日期值如何处理等等。

总之,attribute可以用离目标最近的方式,给目标附加一些运行时可以获取到的信息。程序就可以根据需要利用这些信息来控制行为。
------解决思路----------------------
http://bbs.csdn.net/topics/390369831
------解决思路----------------------
可以看看这个http://www.w3cschool.cc/csharp/csharp-attribute.html,有例子
  相关解决方案