C#:Attribute类

原创 2013年12月03日 23:01:02

Attribute

Attribute,作为名词,意思是标注,特征的意思。我们经常在日常编码中遇到,在某些类,方法,字段,属性上面有如下情形:
        [AttributeTargets_All]
        public TestAttributeClass()
        {

        }

        [Obsolete("该方法已经停用!请使用Method2")]
        public void Method1()
        {
        }
即以一个中括号包含进来的一些特殊的注解属性,来修饰类,方法,字段,属性。这些属性可以是.net自带的,也可以是用户自定义出来的。

借鉴MSDN的解释:
“公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。”

下面以一个简单的示例,介绍一下Attribute的用法:
首先,自定义一些标注属性:
    //AttributeTargets指定对哪些程序元素使用(如这里是针对类)
    [AttributeUsage(AttributeTargets.Class)]
    public class AttributeTargets_ClassAttribute : Attribute
    {
    }

    //限制用在方法上面
    [AttributeUsage(AttributeTargets.Method)]
    public class AttributeTargets_MethodAttribute : Attribute
    {
        public AttributeTargets_MethodAttribute(string ctorStr)
        {
            this.testProperty = ctorStr;
        }
        public string testProperty { get; set; }
    }

    //限制用在方法和类上面
    [AttributeUsage(AttributeTargets.Method|AttributeTargets.Class)]
    public class AttributeTargets_MethodOrClassAttribute : Attribute
    {
    }

    //所有元素上都可以使用
    [AttributeUsage(AttributeTargets.All)]
    public class AttributeTargets_AllAttribute : Attribute
    {
    }

创建一个测试类:
    [AttributeTargets_Class]
    [AttributeTargets_MethodOrClass]
    [AttributeTargets_All]
    class TestAttributeClass
    {
        [AttributeTargets_All]
        public TestAttributeClass()
        {
        }

        [Obsolete("该方法已经停用!请使用Method2")]
        public void Method1()
        {
        }

        [AttributeTargets_Method("just for testing!")]
        public void Method2()
        {
        }

        [AttributeTargets_MethodOrClass]
        public void Method3()
        {
        }

        [AttributeTargets_All]
        public string MyProperty1 { get; set; }

        [AttributeTargets_All]
        public string MyProperty2 { get; set; }

        [AttributeTargets_All]
        public int MyFiled1 = 0;

        [AttributeTargets_All]
        public string MyFiled2 = "test";
    }

在该类中添加一个测试主函数:
     static void Main(string[] args)
        {
            Type classType = typeof(TestAttributeClass);

            Console.WriteLine("下面是获得所有包含attribute的属性:");
            foreach (PropertyInfo pro in classType.GetProperties())
            {
                foreach (Attribute attr in Attribute.GetCustomAttributes(pro))
                {
                    Console.WriteLine("Property:{0} have attribute:{1}", pro.Name, attr.ToString());
                }
                Console.WriteLine("---------------------------");
            }

            Console.WriteLine("下面获得是所有包含attribute的字段:");
            foreach (FieldInfo field in classType.GetFields())
            {
                foreach (Attribute attr in Attribute.GetCustomAttributes(field))
                {
                    Console.WriteLine("Field:{0} have attribute:{1}", field.Name, attr.ToString());
                }
                Console.WriteLine("---------------------------");
            }
            Console.WriteLine("下面是获得所有包含AttributeTargets_MethodAttribute注解属性的方法及attribute中的属性值:");
            foreach (MethodInfo method in classType.GetMethods())
            {
                foreach (Attribute attr in Attribute.GetCustomAttributes(method))
                {
                    //Console.WriteLine("Method:{0} have attribute:{1}",method.Name,attr.ToString());
                    if (attr.GetType() == typeof(AttributeTargets_MethodAttribute))
                    {
                        //Console.WriteLine("Method:{0} have attribute:{1}", method.Name, attr.ToString());
                        Console.WriteLine("Method:{0} have attribute:{1}", method.Name, ((AttributeTargets_MethodAttribute)attr).testProperty);
                    }
                }
                Console.WriteLine("---------------------------");
            }

            Console.WriteLine("下面是获得Method1中ObsoleteAttribute注解属性的只读属性Message:");
            ObsoleteAttribute obs = 
                (ObsoleteAttribute)Attribute.GetCustomAttribute(classType.GetMethod("Method1"), typeof(ObsoleteAttribute));
            Console.WriteLine("Method1 have attribute message:{0}",obs.Message);
        }
编译运行,结果是:



实际上,获得注解属性主要通过.net的反射,Visual Studio中的Intelligence Edit也是通过反射来出提示的。
以上,关于attribute就记录到此。

相关文章推荐

Unity游戏开发——C#特性Attribute与自动化

这篇文章主要讲一下C#里面Attribute的使用方法及其可能的应用场景。比如你把玩家的血量、攻击、防御等属性写到枚举里面。然后界面可能有很多地方要根据这个枚举获取属性的描述文本。比如你做网络框架的时...

C#Attribute属性标签Demo

对于[]这个方括号始终很好奇这是一个何方妖物,查了一下MSDN顿悟,特此写一些代码记录一下首先Attribute是一个类,该类必须继承自Attribute并且命名规则也要用Attribute做后缀,下...

【C#语法】类和方法的特性Attribute

一、引言                 今天,我们来聊一下C#中的特性Attribute。何为特性Attribute?我们先看一个特性的使用例子,我们定义了一个Human类,但是由于某种原因该类不再...

C#制作ORM映射学习笔记一 自定义Attribute类

之前在做unity项目时发现只能用odbc连接数据库,感觉非常的麻烦,因为之前做web开发的时候用惯了ORM映射,所以我想在unity中也用一下ORM(虽然我知道出于性能的考虑这样做事不好的,不过自己...

C#当中利用Attribute实现简易AOP

首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComp...

C#的Attribute

  • 2017年06月22日 10:37
  • 2.52MB
  • 下载

C#中的Attribute详解(下)

从上篇里我们可以看到,Attribute似乎总跟public、static这些关键字(Keyword)出现在一起。莫非使用了Attribute就相当于定义了新的修饰符(Modifier)吗?让我们一窥...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#:Attribute类
举报原因:
原因补充:

(最多只允许输入30个字)