다음을 통해 공유


AttributeUsage(C# 및 Visual Basic)

사용자 지정 특성 클래스을 사용하는 방법을 결정합니다. AttributeUsage는 새 특성이 적용되는 방식을 제어하기 위해 사용자 지정 특성 정의에 적용할 수 있는 특성입니다. 명시적으로 적용될 경우 기본 설정은 다음과 같습니다.

    <System.AttributeUsage(System.AttributeTargets.All, 
                       AllowMultiple:=False, 
                       Inherited:=True)> 
    Class NewAttribute
        Inherits System.Attribute
    End Class
[System.AttributeUsage(System.AttributeTargets.All,
                   AllowMultiple = false,
                   Inherited = true)]
class NewAttribute : System.Attribute { }

이 예제에서 NewAttribute 클래스는 임의의 특성 관련 코드 엔터티에 적용할 수 있지만 각 엔터티에는 한 번씩만 적용할 수 있습니다. 이는 기본 클래스에 적용할 때 파생 클래스에서 상속됩니다.

AllowMultiple 및 Inherited 인수는 선택적이므로 다음 코드는 동일한 작업을 수행합니다.

<System.AttributeUsage(System.AttributeTargets.All)> 
Class NewAttribute
    Inherits System.Attribute
End Class
[System.AttributeUsage(System.AttributeTargets.All)]
class NewAttribute : System.Attribute { }

첫 번째 AttributeUsage 인수는 하나 이상의 AttributeTargets 열거형 요소여야 합니다. 다음과 같이 여러 개의 대상 형식을 OR 연산자로 함께 연결할 수 있습니다.

Imports System


...


<AttributeUsage(AttributeTargets.Property Or AttributeTargets.Field)> 
Class NewPropertyOrFieldAttribute
    Inherits Attribute
End Class
using System;


...


[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
class NewPropertyOrFieldAttribute : Attribute { }

AllowMultiple 인수를 true로 설정하면 결과 특성이 다음과 같이 한 엔터티에 여러 번 적용될 수 있습니다.

Imports System


...


    <AttributeUsage(AttributeTargets.Class, AllowMultiple:=True)> 
    Class MultiUseAttr
        Inherits Attribute
    End Class

    <MultiUseAttr(), MultiUseAttr()> 
    Class Class1
    End Class
using System;


...


[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
class MultiUseAttr : Attribute { }

[MultiUseAttr]
[MultiUseAttr]
class Class1 { }

[MultiUseAttr, MultiUseAttr]
class Class2 { }

이 경우 AllowMultiple이 true로 설정되어 있으므로 MultiUseAttr는 반복하여 적용될 수 있습니다. 여러 특성을 적용하기 위해 표시한 두 형식이 모두 유효합니다.

Inherited를 false로 설정하면 특성을 사용하는 클래스에서 파생된 클래스에 이 특성이 상속되지 않습니다. 예를 들면 다음과 같습니다.

Imports System


...


<AttributeUsage(AttributeTargets.Class, Inherited:=False)> 
Class Attr1
    Inherits Attribute
End Class

<Attr1()> 
Class BClass

End Class   

Class DClass
    Inherits BClass
End Class
using System;


...


[AttributeUsage(AttributeTargets.Class, Inherited = false)]
class Attr1 : Attribute { }

[Attr1]
class BClass { }

class DClass : BClass { }

이 경우 Attr1은 상속을 통해 DClass에 적용되지 않습니다.

설명

AttributeUsage 특성은 단일 사용 특성이므로 동일한 클래스에 여러 번 적용할 수 없습니다. AttributeUsage는 AttributeUsageAttribute의 별칭입니다.

자세한 내용은 리플렉션을 사용하여 특성 액세스(C# 및 Visual Basic)를 참조하십시오.

예제

다음 예제에서는 Inherited 및 AllowMultiple 인수가 AttributeUsage 특성에 미치는 영향을 보여 주고 클래스에 적용된 사용자 지정 특성을 열거하는 방법을 보여 줍니다.

Imports System


...


    ' Create some custom attributes:
    <AttributeUsage(System.AttributeTargets.Class, Inherited:=False)> 
    Class A1
        Inherits System.Attribute
    End Class

    <AttributeUsage(System.AttributeTargets.Class)> 
    Class A2
        Inherits System.Attribute
    End Class    

    <AttributeUsage(System.AttributeTargets.Class, AllowMultiple:=True)> 
    Class A3
        Inherits System.Attribute
    End Class 


    ' Apply custom attributes to classes:
    <A1(), A2()> 
    Class BaseClass

    End Class

    <A3(), A3()> 
    Class DerivedClass
        Inherits BaseClass
    End Class 


    Public Class TestAttributeUsage
        Sub Main()
            Dim b As New BaseClass
            Dim d As New DerivedClass
            ' Display custom attributes for each class.
            Console.WriteLine("Attributes on Base Class:")
            Dim attrs() As Object = b.GetType().GetCustomAttributes(True)

            For Each attr In attrs
                Console.WriteLine(attr)
            Next

            Console.WriteLine("Attributes on Derived Class:")
            attrs = d.GetType().GetCustomAttributes(True)
            For Each attr In attrs
                Console.WriteLine(attr)
            Next             
        End Sub 
    End Class
using System;


...


// Create some custom attributes:
[AttributeUsage(System.AttributeTargets.Class, Inherited = false)]
class A1 : System.Attribute { }

[AttributeUsage(System.AttributeTargets.Class)]
class A2 : System.Attribute { }

[AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true)]
class A3 : System.Attribute { }

// Apply custom attributes to classes:
[A1, A2]
class BaseClass { }

[A3, A3]
class DerivedClass : BaseClass { }

public class TestAttributeUsage
{
    static void Main()
    {
        BaseClass b = new BaseClass();
        DerivedClass d = new DerivedClass();

        // Display custom attributes for each class.
        Console.WriteLine("Attributes on Base Class:");
        object[] attrs = b.GetType().GetCustomAttributes(true);
        foreach (Attribute attr in attrs)
        {
            Console.WriteLine(attr);
        }

        Console.WriteLine("Attributes on Derived Class:");
        attrs = d.GetType().GetCustomAttributes(true);
        foreach (Attribute attr in attrs)
        {
            Console.WriteLine(attr);
        }
    }
}

샘플 출력

Attributes on Base Class:
A1
A2
Attributes on Derived Class:
A3
A3
A2

참고 항목

참조

리플렉션(C# 및 Visual Basic)

특성(C# 및 Visual Basic)

사용자 지정 특성 만들기(C# 및 Visual Basic)

리플렉션을 사용하여 특성 액세스(C# 및 Visual Basic)

Attribute

System.Reflection

개념

C# 프로그래밍 가이드

기타 리소스

Visual Basic 프로그래밍 가이드

특성을 사용하여 메타데이터 확장