代码改变世界

Attribute基础,园友不用看,浪费您时间

2012-02-01 19:09  海不是蓝  阅读(378)  评论(0编辑  收藏  举报

Attribute基础

Attribute作用就是为程序添加说明信息,特性都是继承System.Attribute。所有特性都必须是System.Attribute的派生类(别想逆天!)。

 

特性是个类,这个类很简单,简单到只有基本的字段或属性,别想在特性里面添加方法,这个也是逆天的。

 

创建个简单的特性

[AttributeUsage(AttributeTargets.All)]

public class TestAttribute : Attribute

{

    private string str;

    public string Str

    {

        get { return str; }

        set { str = value; }

    }

    public TestAttribute(string str)

    { this.str = str; }

}

特性前有个AttributeUsage特性,它指明TextAttribute能够应用的范围,这里是所有类型的项。

 

使用这个特性

[TestAttribute("blah blah blah......")]

public class Test { }

 

获取Test类上的特性

通常用下面2个方法获取

1.Attribute.GetCustomAttribute

public static Attribute GetCustomAttribute(MemberInfo element, Type attributeType);

 

2.MemberInfo类中的GetCustomAttributes方法

public abstract object[] GetCustomAttributes(bool inherit);

参数如果为true,那么所有基类的特性都会被包含进来,否则获取指定类型本身定义的特性。

class Program

{

    static void Main()

    {

        Type t = typeof(Test);

        Type t1 = typeof(TestAttribute);

        TestAttribute ta = (TestAttribute)Attribute.GetCustomAttribute(t, t1);

        Console.WriteLine(ta.Str);

        Console.WriteLine("---------------------------------------");

        object[] obj = t.GetCustomAttributes(false);

        foreach (object o in obj)

        {

            TestAttribute ta1 = (TestAttribute)o;

            Console.WriteLine("{0}---{1}", o, ta1.Str);

        }

        Console.Read();

    }

}

 

特性属性的其它赋值方法

private string str1;

public string Str1

{

    get { return str1; }

    set { str1 = value; }

}

public TestAttribute(string str)

{

    this.str = str;

    this.str1 = "null";

}

这个时候多了个str1字段,但是构造函数没有提供外面对他赋值的就会。

这个是的赋值方式就是下面的样子

[TestAttribute("blah blah blah......", Str1 = "123")]

public class Test { }

 

《clr via c#》的Attribute那一章今天没心情看了,有空看看