C# 特性学习(二)

本文介绍了如何在C#中自定义特性类并应用于类和方法。通过实例展示了特性类的使用方式,包括如何获取特性描述和作者信息,以及特性在方法调用时的自描述作用。文章还阐述了特性在程序开发中的灵活性和重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义了一个特性类:

    [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
    class WahAttribute:System.Attribute
    {
        private string description;

        public string Description
        {
            get { return description; }
            set { description = value; }
        }
        private string author;

        public string Author
        {
            get { return author; }
            set { author = value; }
        }
        public WahAttribute(string desc)
        {
            this.description = desc;
        }
    }

运用特性类:

namespace attributeDemo
{
    public class Teacher
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private string sex;

        public string Sex
        {
            get { return sex; }
            set { sex = value; }
        }
        //只有用户名为wah的才可以调用此方法
        [Wah("this is my attribute test", Author = "wah", Description = "test")]
        public string getMessage()
        {
            return "好好学习,天天向上";
        }
        [Wah("this is with parameters test",Author="wanggaihui",Description="test with parameters")]
        public int Test(int a,int b)
        {
            return a+b;
        }
    }
}

处理特性类:

        private void button_Click(object sender, EventArgs e)
        {
            //得到类型
            Type type = typeof(Teacher);
            //得到此类型所有方法
            MethodInfo[] methods = type.GetMethods();
            foreach (MethodInfo method in methods)
            {
                //得到此方法的所有特性
                object[] attributes = method.GetCustomAttributes(false);
                foreach (object o in attributes)
                {
                    //判断是否是自己定义的特性
                    if (o.GetType() == typeof(WahAttribute))
                    {
                        //强转取得值
                        WahAttribute waha = (WahAttribute)o;
                        this.listBox1.Items.Add("author=" + waha.Author);
                        this.listBox1.Items.Add("description=" + waha.Description);
                    }
                }
            }
        }

C#特性可以应用于各种类型和成员。加在类前面的是类特性,加在方法前面的是方法特性。无论他们被用在哪里,无论他们之间有什么区别,特性的最主要的目的就是自描述。并且因为特性是可以由自己定制的,而不仅仅局限于.net提供的那几个现成的,因此给C#程序开发带来了很大的灵活性。

 

 

我们还是借用生活中的例子来介绍C#的特性机制吧。

假设有一天你去坐飞机,你就必须提前去机场登机处换登机牌。登机牌就是一张纸,上面写着哪趟航班、由哪里飞往哪里以及你的名字、座位号等等信息,其实,这就是特性。它不需要你生理上包含这些属性(人类出现那会儿还没飞机呢),就像上面的HumanBase类没有IsSerializable这样的属性,特性只需要在类或方法需要的时候加上去就行了,就像你不总是在天上飞一样。

拿到了登机牌,就意味着你可以合法地登机起飞了。但此时你还不知道你要坐的飞机停在哪里,不用担心,地勤人员会开车送你过去,但是他怎么知道你是哪趟航班的呢?显然还是通过你手中的登机牌。所以,特性最大的特点就是自描述。

既然是起到描述的作用,那目的就是在于限定。就好比地勤不会把你随便拉到一架飞机跟前就扔上去了事,因为标签上的说明信息就是起到限定的作用,限定了目的地、乘客和航班,任何差错都被视为异常。如果前面的HumanBase不加上Serializable特性就不能在网络上传输

指定特性参数

如果找到这样的构造函数,编译器就会把指定的元数据传送给程序集。如果找不到,就生成一个这样的构造函数。如果找到一个这样的构造函数,编译器就会把指定的元数据传送给程序集。如果找不到就生成一个编译错误。如后面所述,反射会从程序集中读取元数据,并实例化他们表示的特性类。因此,编译器需要确保存在这样的构造函数,才能在运行期间实例化指定的特性

 

转自:http://blog.youkuaiyun.com/helloguonan/article/details/5912399

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值