Attribute 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示自定义属性的基类。
public ref class Attribute abstractpublic ref class Attribute abstract : System::Runtime::InteropServices::_Attribute[System.AttributeUsage(System.AttributeTargets.All, AllowMultiple=false, Inherited=true)]
public abstract class Attribute[System.AttributeUsage(System.AttributeTargets.All, AllowMultiple=false, Inherited=true)]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Serializable]
public abstract class Attribute : System.Runtime.InteropServices._Attribute[System.AttributeUsage(System.AttributeTargets.All, AllowMultiple=false, Inherited=true)]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Attribute : System.Runtime.InteropServices._Attribute[<System.AttributeUsage(System.AttributeTargets.All, AllowMultiple=false, Inherited=true)>]
type Attribute = class[<System.AttributeUsage(System.AttributeTargets.All, AllowMultiple=false, Inherited=true)>]
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Serializable>]
type Attribute = class
    interface _Attribute[<System.AttributeUsage(System.AttributeTargets.All, AllowMultiple=false, Inherited=true)>]
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Attribute = class
    interface _AttributePublic MustInherit Class AttributePublic MustInherit Class Attribute
Implements _Attribute- 继承
- 
				Attribute
- 派生
- 属性
- 实现
示例
下面的代码示例演示了 Attribute的用法。
using namespace System;
using namespace System::Reflection;
// An enumeration of animals. Start at 1 (0 = uninitialized).
public enum class Animal
{
    // Pets.
    Dog = 1,
    Cat, Bird
};
// A custom attribute to allow a target to have a pet.
public ref class AnimalTypeAttribute: public Attribute
{
public:
    // The constructor is called when the attribute is set.
    AnimalTypeAttribute( Animal pet )
    {
        thePet = pet;
    }
protected:
    // Keep a variable internally ...
    Animal thePet;
public:
    property Animal Pet 
    {
        // .. and show a copy to the outside world.
        Animal get()
        {
            return thePet;
        }
        void set( Animal value )
        {
            thePet = value;
        }
    }
};
// A test class where each method has its own pet.
ref class AnimalTypeTestClass
{
public:
    [AnimalType(Animal::Dog)]
    void DogMethod(){}
    [AnimalType(Animal::Cat)]
    void CatMethod(){}
    [AnimalType(Animal::Bird)]
    void BirdMethod(){}
};
int main()
{
    AnimalTypeTestClass^ testClass = gcnew AnimalTypeTestClass;
    Type^ type = testClass->GetType();
    // Iterate through all the methods of the class.
    System::Collections::IEnumerator^ myEnum = 
        type->GetMethods()->GetEnumerator();
    while ( myEnum->MoveNext() )
    {
        MethodInfo^ mInfo = safe_cast<MethodInfo^>(myEnum->Current);
        // Iterate through all the Attributes for each method.
        System::Collections::IEnumerator^ myEnum1 = 
            Attribute::GetCustomAttributes( mInfo )->GetEnumerator();
        while ( myEnum1->MoveNext() )
        {
            Attribute^ attr = safe_cast<Attribute^>(myEnum1->Current);
            // Check for the AnimalType attribute.
            if ( attr->GetType() == AnimalTypeAttribute::typeid )
                Console::WriteLine( "Method {0} has a pet {1} attribute.", 
                mInfo->Name, (dynamic_cast<AnimalTypeAttribute^>(attr))->Pet );
        }
    }
}
/*
 * Output:
 * Method DogMethod has a pet Dog attribute.
 * Method CatMethod has a pet Cat attribute.
 * Method BirdMethod has a pet Bird attribute.
 */
using System;
using System.Reflection;
// An enumeration of animals. Start at 1 (0 = uninitialized).
public enum Animal {
    // Pets.
    Dog = 1,
    Cat,
    Bird,
}
// A custom attribute to allow a target to have a pet.
public class AnimalTypeAttribute : Attribute {
    // The constructor is called when the attribute is set.
    public AnimalTypeAttribute(Animal pet) {
        thePet = pet;
    }
    // Keep a variable internally ...
    protected Animal thePet;
    // .. and show a copy to the outside world.
    public Animal Pet {
        get { return thePet; }
        set { thePet = value; }
    }
}
// A test class where each method has its own pet.
class AnimalTypeTestClass {
    [AnimalType(Animal.Dog)]
    public void DogMethod() {}
    [AnimalType(Animal.Cat)]
    public void CatMethod() {}
    [AnimalType(Animal.Bird)]
    public void BirdMethod() {}
}
class DemoClass {
    static void Main(string[] args) {
        AnimalTypeTestClass testClass = new AnimalTypeTestClass();
        Type type = testClass.GetType();
        // Iterate through all the methods of the class.
        foreach(MethodInfo mInfo in type.GetMethods()) {
            // Iterate through all the Attributes for each method.
            foreach (Attribute attr in
                Attribute.GetCustomAttributes(mInfo)) {
                // Check for the AnimalType attribute.
                if (attr.GetType() == typeof(AnimalTypeAttribute))
                    Console.WriteLine(
                        "Method {0} has a pet {1} attribute.",
                        mInfo.Name, ((AnimalTypeAttribute)attr).Pet);
            }
        }
    }
}
/*
 * Output:
 * Method DogMethod has a pet Dog attribute.
 * Method CatMethod has a pet Cat attribute.
 * Method BirdMethod has a pet Bird attribute.
 */
open System
// An enumeration of animals. Start at 1 (0 = uninitialized).
type Animal =
    | Dog = 1
    | Cat = 2
    | Bird = 3
// A custom attribute to allow a target to have a pet.
type AnimalTypeAttribute(pet) =
    inherit Attribute()
    member val Pet = pet with get, set
// A test class where each method has its own pet.
type AnimalTypeTestClass() =
    [<AnimalType(Animal.Dog)>]
    member _.DogMethod() = ()
    [<AnimalType(Animal.Cat)>]
    member _.CatMethod() = ()
    [<AnimalType(Animal.Bird)>]
    member _.BirdMethod() = ()
let testClass = AnimalTypeTestClass()
let clsType = testClass.GetType()
// Iterate through all the methods of the class.
for mInfo in clsType.GetMethods() do
    // Iterate through all the Attributes for each method.
    for attr in Attribute.GetCustomAttributes mInfo do
        // Check for the AnimalType attribute.
        if attr.GetType() = typeof<AnimalTypeAttribute> then
            printfn $"Method {mInfo.Name} has a pet {(attr :?> AnimalTypeAttribute).Pet} attribute."
// Output:
//   Method DogMethod has a pet Dog attribute.
//   Method CatMethod has a pet Cat attribute.
//   Method BirdMethod has a pet Bird attribute.
Imports System.Reflection
Public Module CustomAttrVB
    ' An enumeration of animals. Start at 1 (0 = uninitialized).
    Public Enum Animal
        ' Pets
        Dog = 1
        Cat
        Bird
    End Enum
    ' Visual Basic requires the AttributeUsage be specified.
    ' A custom attribute to allow a target to have a pet.
    <AttributeUsage(AttributeTargets.Method)> _
    Public Class AnimalTypeAttribute
        Inherits Attribute
        ' The constructor is called when the attribute is set.
        Public Sub New(ByVal animal As Animal)
            Me.thePet = animal
        End Sub
        ' Keep a variable internally ...
        Protected thePet As Animal
        ' .. and show a copy to the outside world.
        Public Property Pet() As Animal
            Get
                Return thePet
            End Get
            Set(ByVal Value As Animal)
                thePet = Value
            End Set
        End Property
    End Class
    ' A test class where each method has its own pet.
    Class AnimalTypeTestClass
        <AnimalType(Animal.Dog)> _
        Public Sub DogMethod()
        End Sub
        <AnimalType(Animal.Cat)> _
        Public Sub CatMethod()
        End Sub
        <AnimalType(Animal.Bird)> _
        Public Sub BirdMethod()
        End Sub
    End Class
    ' The runtime test.
    Sub Main()
        Dim testClass As New AnimalTypeTestClass()
        Dim tcType As Type = testClass.GetType()
        Dim mInfo As MethodInfo
        ' Iterate through all the methods of the class.
        For Each mInfo In tcType.GetMethods()
            Dim attr As Attribute
            ' Iterate through all the attributes of the method.
            For Each attr In Attribute.GetCustomAttributes(mInfo)
                If TypeOf attr Is AnimalTypeAttribute Then
                    Dim attrCustom As AnimalTypeAttribute = _
                        CType(attr, AnimalTypeAttribute)
                    Console.WriteLine("Method {0} has a pet {1} attribute.", _
                         mInfo.Name(), attrCustom.Pet.ToString())
                End If
            Next
        Next
    End Sub
End Module
' Output:
' Method DogMethod has a pet Dog attribute.
' Method CatMethod has a pet Cat attribute.
' Method BirdMethod has a pet Bird attribute.
注解
Attribute 类将预定义的系统信息或用户定义的自定义信息与目标元素相关联。 目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性、返回值、结构或其他属性。
属性提供的信息也称为元数据。 应用程序可以在运行时检查元数据,以控制程序处理数据的方式,或者外部工具在运行时之前控制应用程序本身的处理和维护方式。 例如,.NET 预定义并使用属性类型来控制运行时行为,一些编程语言使用属性类型来表示 .NET 通用类型系统不直接支持的语言功能。
所有属性类型直接或间接派生自 Attribute 类。 属性可以应用于任何目标元素;多个属性可以应用于同一目标元素;属性可由派生自目标元素的元素继承。 使用 AttributeTargets 类指定应用属性的目标元素。
Attribute 类提供了用于检索和测试自定义属性的便捷方法。 有关使用属性的详细信息,请参阅 应用属性 和 属性。
构造函数
| Attribute() | 初始化 Attribute 类的新实例。 | 
属性
| TypeId | 在派生类中实现时,获取此 Attribute的唯一标识符。 | 
方法
| Equals(Object) | 返回一个值,该值指示此实例是否等于指定对象。 | 
| GetCustomAttribute(Assembly, Type, Boolean) | 检索应用于程序集的自定义属性。 参数指定要搜索的程序集、要搜索的自定义属性的类型和忽略的搜索选项。 | 
| GetCustomAttribute(Assembly, Type) | 检索应用于指定程序集的自定义属性。 参数指定要搜索的程序集和自定义属性的类型。 | 
| GetCustomAttribute(MemberInfo, Type, Boolean) | 检索应用于类型成员的自定义属性。 参数指定要搜索的成员、要搜索的自定义属性的类型以及是否搜索成员的上级。 | 
| GetCustomAttribute(MemberInfo, Type) | 检索应用于类型成员的自定义属性。 参数指定要搜索的成员和自定义属性的类型。 | 
| GetCustomAttribute(Module, Type, Boolean) | 检索应用于模块的自定义属性。 参数指定要搜索的模块、要搜索的自定义属性的类型和忽略的搜索选项。 | 
| GetCustomAttribute(Module, Type) | 检索应用于模块的自定义属性。 参数指定要搜索的模块和自定义属性的类型。 | 
| GetCustomAttribute(ParameterInfo, Type, Boolean) | 检索应用于方法参数的自定义属性。 参数指定要搜索的方法参数、要搜索的自定义属性的类型,以及是否搜索方法参数的上级。 | 
| GetCustomAttribute(ParameterInfo, Type) | 检索应用于方法参数的自定义属性。 参数指定要搜索的方法参数和自定义属性的类型。 | 
| GetCustomAttributes(Assembly, Boolean) | 检索应用于程序集的自定义特性的数组。 参数指定程序集和忽略的搜索选项。 | 
| GetCustomAttributes(Assembly, Type, Boolean) | 检索应用于程序集的自定义特性的数组。 参数指定要搜索的程序集、要搜索的自定义属性的类型和忽略的搜索选项。 | 
| GetCustomAttributes(Assembly, Type) | 检索应用于程序集的自定义特性的数组。 参数指定要搜索的程序集和自定义属性的类型。 | 
| GetCustomAttributes(Assembly) | 检索应用于程序集的自定义特性的数组。 参数指定程序集。 | 
| GetCustomAttributes(MemberInfo, Boolean) | 检索应用于类型成员的自定义属性的数组。 参数指定要搜索的成员、要搜索的自定义属性的类型以及是否搜索成员的上级。 | 
| GetCustomAttributes(MemberInfo, Type, Boolean) | 检索应用于类型成员的自定义属性的数组。 参数指定要搜索的成员、要搜索的自定义属性的类型以及是否搜索成员的上级。 | 
| GetCustomAttributes(MemberInfo, Type) | 检索应用于类型成员的自定义属性的数组。 参数指定要搜索的成员和自定义属性的类型。 | 
| GetCustomAttributes(MemberInfo) | 检索应用于类型成员的自定义属性的数组。 参数指定成员。 | 
| GetCustomAttributes(Module, Boolean) | 检索应用于模块的自定义属性的数组。 参数指定模块和忽略的搜索选项。 | 
| GetCustomAttributes(Module, Type, Boolean) | 检索应用于模块的自定义属性的数组。 参数指定要搜索的模块、要搜索的自定义属性的类型和忽略的搜索选项。 | 
| GetCustomAttributes(Module, Type) | 检索应用于模块的自定义属性的数组。 参数指定要搜索的模块和自定义属性的类型。 | 
| GetCustomAttributes(Module) | 检索应用于模块的自定义属性的数组。 参数指定模块。 | 
| GetCustomAttributes(ParameterInfo, Boolean) | 检索应用于方法参数的自定义特性的数组。 参数指定方法参数,以及是否搜索方法参数的上级。 | 
| GetCustomAttributes(ParameterInfo, Type, Boolean) | 检索应用于方法参数的自定义特性的数组。 参数指定要搜索的方法参数、要搜索的自定义属性的类型,以及是否搜索方法参数的上级。 | 
| GetCustomAttributes(ParameterInfo, Type) | 检索应用于方法参数的自定义特性的数组。 参数指定要搜索的方法参数和自定义属性的类型。 | 
| GetCustomAttributes(ParameterInfo) | 检索应用于方法参数的自定义特性的数组。 参数指定方法参数。 | 
| GetHashCode() | 返回此实例的哈希代码。 | 
| GetType() | 获取当前实例的 Type。(继承自 Object) | 
| IsDefaultAttribute() | 在派生类中重写时,指示此实例的值是否为派生类的默认值。 | 
| IsDefined(Assembly, Type, Boolean) | 确定是否将任何自定义属性应用于程序集。 参数指定要搜索的程序集、要搜索的自定义属性的类型和忽略的搜索选项。 | 
| IsDefined(Assembly, Type) | 确定是否将任何自定义属性应用于程序集。 参数指定要搜索的程序集和自定义属性的类型。 | 
| IsDefined(MemberInfo, Type, Boolean) | 确定是否将任何自定义属性应用于类型的成员。 参数指定要搜索的成员、要搜索的自定义属性的类型以及是否搜索成员的上级。 | 
| IsDefined(MemberInfo, Type) | 确定是否将任何自定义属性应用于类型的成员。 参数指定要搜索的成员和自定义属性的类型。 | 
| IsDefined(Module, Type, Boolean) | 确定是否将任何自定义属性应用于模块。 参数指定要搜索的模块、要搜索的自定义属性的类型和忽略的搜索选项。 | 
| IsDefined(Module, Type) | 确定指定类型的任何自定义属性是否应用于模块。 参数指定要搜索的模块和自定义属性的类型。 | 
| IsDefined(ParameterInfo, Type, Boolean) | 确定是否将任何自定义属性应用于方法参数。 参数指定要搜索的方法参数、要搜索的自定义属性的类型,以及是否搜索方法参数的上级。 | 
| IsDefined(ParameterInfo, Type) | 确定是否将任何自定义属性应用于方法参数。 参数指定要搜索的方法参数和自定义属性的类型。 | 
| Match(Object) | 在派生类中重写时,返回一个值,该值指示此实例是否等于指定对象。 | 
| MemberwiseClone() | 创建当前 Object的浅表副本。(继承自 Object) | 
| ToString() | 返回一个表示当前对象的字符串。(继承自 Object) | 
显式接口实现
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) | 将一组名称映射到相应的调度标识符集。 | 
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) | 检索对象的类型信息,该信息可用于获取接口的类型信息。 | 
| _Attribute.GetTypeInfoCount(UInt32) | 检索对象提供的类型信息接口数(0 或 1)。 | 
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) | 提供对对象公开的属性和方法的访问。 | 
适用于
线程安全性
此类型是线程安全的。
另请参阅
- 应用属性
- 使用属性 扩展元数据