() { /// return null; // Warning: Possible 'null' assignment /// } /// </example> [AttributeUsage Allows disabling inspections for MVC views within a class or a method. /// [AttributeUsage If applied to a method, the MVC view component view name is default. /// [AttributeUsage The mandatory argument of /// the attribute is the assertion type. /// [AttributeUsage (AttributeTargets.Property)] public sealed class RazorLayoutAttribute : Attribute { } [AttributeUsage
() { /// return null; // Warning: Possible 'null' assignment /// } /// </example> [AttributeUsage Allows disabling inspections for MVC views within a class or a method. /// [AttributeUsage If applied to a method, the MVC view component view name is default. /// [AttributeUsage The mandatory argument of /// the attribute is the assertion type. /// [AttributeUsage (AttributeTargets.Property)] public sealed class RazorLayoutAttribute : Attribute { } [AttributeUsage
AttributeUsage特性 为了能够使自定义特性类可以使用,需要为其再添加一个系统定义的特性AttributeUsage,该特性定义了自定义特性该如何使用。 这个值是由AttributeUsage的第一个参数指定,它是AttributeTargets的枚举。 [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] class MyAttribute : Attribute { } AllowMultiple参数 AllowMultiple参数也是AttributeUsage的一个参数,指定了特性能否多次作用于同一元素上。 [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = true)] class MyAttribute
使用AttributeUsage特性标记自定义特性 看一下AttributeUsage的定义: public sealed class AttributeUsageAttribute : Attribute 首先看上面AttributeUsage是如何加载到ObsoleteAttribute特性上面的: [AttributeUsage(6140, Inherited = false)] 这里大家一定疑惑为什么会这样划分参数 AttributeUsage特性的构造函数接受一个AttributeTargets类型的参数,它定义了特性可以应用的类型,AttributeTargets也是一个位标记。 (AttributeTargets.Class)] AttributeUsage是一个位标记,可以使用或运算来进行组合,当这样写时: [AttributeUsage(AttributeTargets.Class 而ObsoleteAttribute特性上加载的AttributeUsage是这样的: [AttributeUsage(6140, Inherited = false)] 可以通过下面的语句来获得6140
---如TestAttribute (3)、给自定义Attribute限定施加的元素的类型 ---AttributeUsage 通过AttributeUsage来给我们自定义的Attribute限定施加元素的类型 ,代码形式如下: [AttributeUsage(参数设置)] public class TestAttribute:Attribute { //方法体 } 非常有意思的是AttributeUsage (4)、AttributeUsage的使用例子 class Program { static void Main(string[] args) { 设置Test属性只对类有效 /// [AttributeUsage(AttributeTargets.Class)] public class TestAttribute :Attribute { } 上面定义了一个Test属性,并通过AttributeUsage设置该属性只对类有效,但是Program类中却用它修饰方法,所以程序报错,抱错信息如下
[AttributeUsage(AttributeTargets.All)] public sealed class BadCustomAttribute : Attribute { string [AttributeUsage(AttributeTargets.All)] public sealed class GoodCustomAttribute : Attribute { public <AttributeUsage(AttributeTargets.All)> Public NotInheritable Class BadCustomAttribute Inherits <AttributeUsage(AttributeTargets.All)> Public NotInheritable Class GoodCustomAttribute Inherits 下面的示例演示了具有位置参数和命名参数的特性的实现: [AttributeUsage(AttributeTargets.All)] public sealed class GoodCustomAttribute
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]public class 100)]public class MyClass{ [MyCustom("MethodLevel", 200)] public void MyMethod() { }}使用AttributeUsage 限制特性应用AttributeUsage属性用于定义特性的适用范围和行为。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]public class 这通过AttributeUsage属性的Inherited参数来控制。特性的排列组合你可以将多个特性应用到同一个程序元素上,只要特性的定义允许多次应用。
} public string DeveloperName { get; } } // Satisfies rule: Attributes specify AttributeUsage [AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate ReadOnly Property DeveloperName() As String End Class ' Satisfies rule: Attributes specify AttributeUsage <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Enum Or AttributeTargets.Interface Or AttributeTargets.Delegate
这三个特性分别是:Serializable、AttributeUsage 和 ComVisible。 我们首先看上面AttributeUsage是如何加载到ObsoleteAttribute特性上面的。 [AttributeUsage(8192, Inherited = false)] 然后我们看一下AttributeUsage的定义: // 摘要: // 指定另一特性类的用法。 Inherited=false)] 而ObsoleteAttribute特性上加载的 AttributeUsage是这样的: [AttributeUsage(8192, Inherited = false )] 因为AttributeUsage是一个位标记,所以可以使用按位或“|”来进行组合。
常用的修饰属性的属性是AttributeUsage 属性,它用来限制自定义属性可以修饰的元素类型,例如我们将CarAttribute属性的使用范围限制为类和接口,可以这么做: [AttributeUsage AttributeTargets.Class | AttributeTargets.Interface)] public class CarAttribute: Attribute { //more code } AttributeUsage AttributeUsage还允许我们定义从修饰对象继承的对象,是否也获得该属性。 同样我们将CarAttribute修改为从修饰对象继承的对象可以获得该属性: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface 我们可以继承Attribute类来自定义属性,并使用AttributeUsage属性限制属性的使用范围,并通过反射来获取属性数据。
这三个特性分别是:Serializable、AttributeUsage 和 ComVisible。 这里应该记得“元元数据”也是一个特性,大多数情况下,我们只需要掌握 AttributeUsage就可以了,所以现在就研究一下它。 我们首先看上面AttributeUsage是如何加载到ObsoleteAttribute特性上面的。 [AttributeUsage(6140, Inherited = false)] 然后我们看一下AttributeUsage的定义: namespace System { public sealed 而ObsoleteAttribute特性上加载的 AttributeUsage是这样的: [AttributeUsage(6140, Inherited = false)] 因为AttributeUsage
1.预定定义特性之一:AttributeUsage AttributeUsage有三个属性: 第一个属性:ValidOn 规定特性可被放置的语言元素,默认是AttributeTargets.All 2.Attribute 特性的实例 [AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=true)]
预定义特性(Attribute) .Net 框架提供了三种预定义特性: AttributeUsage Conditional Obsolete AttributeUsage 预定义特性 AttributeUsage 规定该特性的语法如下: [AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited )] 其中 例如: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | 例如: // 一个自定义特性 BugFix 被赋给类及其成员 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor 下面的代码演示了 DeBugInfo 类: 实例 // 一个自定义特性 BugFix 被赋给类及其成员 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor
说了这么多,我们自己重新写一个特性类吧: 1、限定只能给类使用的特性 [AttributeUsage(AttributeTargets.Class)] public class DemoAttribute : Attribute { } 2、限定只能给方法使用的特性 [AttributeUsage(AttributeTargets.Method)] public class DemoAttribute : Attribute { } 4、限定类和枚举可以使用,但不能继承的特性 [AttributeUsage(AttributeTargets.Class| AttributeTargets.Enum, 更多的使用方式: [AttributeUsage(AttributeTargets.Class| AttributeTargets.Enum, Inherited = false)] public class 首先,声明一个类和特性: [AttributeUsage(AttributeTargets.Class| AttributeTargets.Enum, Inherited = false)] public
说了这么多,我们自己重新写一个特性类吧: 1.限定只能给类使用的特性 [AttributeUsage(AttributeTargets.Class)] public class DemoAttribute : Attribute { } 2.限定只能给方法使用的特性 [AttributeUsage(AttributeTargets.Method)] public class DemoAttribute : Attribute { } 4.限定类和枚举可以使用,但不能继承的 特性 [AttributeUsage(AttributeTargets.Class| AttributeTargets.Enum 更多的使用方式: [AttributeUsage(AttributeTargets.Class| AttributeTargets.Enum, Inherited = false)] public class 首先,声明一个类和特性: [AttributeUsage(AttributeTargets.Class| AttributeTargets.Enum, Inherited = false)] public
System.ServiceModel.ServiceContractAttribute System.ServiceModel.OperationContractAttribute 其中应用在ServiceContractAttribute服务契约特性上的特性[AttributeUsage 应用在OperationContractAttribute服务契约特性上的特性[AttributeUsage(AttributeTargets.Method)]表示操作契约特性只能应用于方法成员。 ServiceContractAttribute特性所应用的AttributeUsage的Inherited属性设置为false,所以服务契约不具有继承性。 OperationContractAttribute特性所应用的AttributeUsage的Inherited属性设置为true,所以具有继承性。
1 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method| AttributeTargets.Property, AllowMultiple 1 [AttributeUsage( AttributeTargets.Method| AttributeTargets.Class| AttributeTargets.Parameter, AllowMultiple 1 [AttributeUsage( AttributeTargets.Method| AttributeTargets.Class| AttributeTargets.Property, AllowMultiple 如果我们希望某个InterceptorAttribute提供的Interceptor在最终的目标方法上只能执行一次,我们需要通过应用AttributeUsage特性并将其AllowMultiple设置为 1 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method| AttributeTargets.Property)] 2 public
使用示例
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class MyTestAttribute : Attribute
{
}
AttributeUsageAttribute 定义一个特性时,大概格式如下
[AttributeUsage(
validon,
AllowMultiple 定义一个特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field ///
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] public sealed class DeveloperAttribute <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Struct)> Public NotInheritable Class DeveloperAttribute
3、自定义特性
使用AttributeUsage,来控制如何应用新定义的特性
[AttributeUsageAttribute(AttributeTargets.All 可以应用到任何元素 hovertree.com
(2)自定义特性类
/**************自定义特性类*****************/
///