位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 创建特性

提问人:刘团圆发布时间:2020-12-08

    通过System.Attribute类进行派生,我们也可以创建出自己的特性。一般来说,如果除了包含和不包含特定的特性外,我们的代码不需要获得更多信息就可以完成需要的工作,那么我们不必完成这些额外的工作。但有时,如果我们希望某些特性可以被自定义,则可以提供非默认的构造函数和/或可写属性.

    另外,还需要为自己的特性做两个选择:要将其应用到什么类型的目标(类、属性或其他),以及是否可以对同一个目标进行多次应用。要指定上述信息,我们需要通过对特性应用一个特性来实现(这句话实在是很拗口!),这个特性就是AttributeUsageAttribute。这个特性带有一个类型为AttributeTargets的构造函数参数值,通过|运算符即可通过相应的枚举值组合出我们需要的值。另外,该特性还有一个布尔值类型的属性AllowMultiple.用于指定是否可以多次应用特性。


例如,下面的代码指定了一个可以应用到类或属性中(一次)的特性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple = false)]

class DoeslnterestingThingsAttribute : Attribute

{

    public DoesInterestingThingsAttribute(int howManyTimes)

    {

        HowManyTimes = howManyTimes;

    }

    public string WhatDoesltDo { get; set; } 

    public int HowManyTimes { get; private set; }

}

这样,就可以像前面的代码片段中看到的那样来使用DoesMerestingTTiings特性了:

    [DoesInterestingThings (1000, WhatDoesltDo = "voodoo")] 

    public class DecoratedClass {}

只要像下面这样修改前面的代码,就可以访问这一特性的属性:

Type classType = typeof{DecoratedClass);

object[] customAttributes = classType,GetCustomAttributes(true); 

foreach (object customAttribute in customAttributes)

{

    WriteLine ($.’Attribute of type {customAttribute} found.");

    DoesInterestingThingsAttribute interestingAttribute = customAttribute as DoesInterestingThingsAttribute; 

    if (interestingAttribute != null)

    {

        WriteLine($"This class does {interestingAttribute,WhatDoesltDo} x " +

                $"{interestingAttribute. HowManyTimes}!"};

    }

}

运用了本节讲到的各种方法后,最终代码将可以得到如图所示的结果。

image.png

“特性”这一技术在所有.NET应用程序都非常有用,特别是WPF和UniveGal Windows应用程序。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部