Fork me on GitHub

定制特性

1,定制特性

①C#允许用一个前缀明确指定特性要应用的目标元素

[assembly: AssemblyVersion("1.0.0.0")]

②AttributeUsage. Inherited(特性应用于基类时,是否同时应用于派生类和重写的方法)

    [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,Inherited = true)]
    internal class TastyAttribute : Attribute
    {
    }

    [Tasty,Serializable]
    internal class BaseType
    {
        [Tasty]
        protected virtual void DoSomething(){}
    }
    //继承父类Tasty的特性
    internal class DerivedType : BaseType
    {
        //继承Tasty的特性
        protected override void DoSomething(){}
    }
    //如果特性类没有显示的引用AttributeUsage,则默认AttributeUsage如下
    [AttributeUsage(AttributeTargets.All,AllowMultiple = false, Inherited = true)]

 2,检测定制特性

方法名称

说明

IsDefined

至少有一个指定的Attribute派生类的实例与目标关联,就会返回true。

这个方法的效率很高,它不会构造(反序列化)特性类的任何实例

GetCustomerAttributes

返回应用于目标的指定特性对象的集合。

每个实例都使用编译时指定的参数、字段和属性来构造(反序列化)。

没有指定的集合则返回空集合。

GetCustomerAttribute

返回应用于目标的指定特性对象的实例。

实例使用编译时指定的参数、字段和属性来构造(但序列化)。

没有指定的特性实例,则返回null。

目标指定了多个实例,则抛出异常

 

3,检查定制特性时不创建从Attribute派生的对象

调用Attribute的GetCustomAttribute或者GetCustomerAttribute方法时,这些方法会在内部调用特性类的构造器,而且可能调用属性的set访问器方法。可能存在安全隐患

            //在查找特性的同时禁止执行特性类中的代码
            CustomAttributeData.GetCustomAttributes()

 

posted on 2017-06-18 13:58  *Hunter  阅读(169)  评论(0编辑  收藏  举报

导航

AmazingCounters.com