본문 바로가기

프로그램-잉/C#

Attribute

개요

특성은 선언적으로 정보를 코드와 연결하는 방법을 제공합니다. 다양한 대상에 적용할 수 있는 재사용 가능 요소를 제공할 수도 있습니다.

 

기본

C#에서 특성은 Attribute 기본 클래스에서 상속되는 클래스입니다. Attribute에서 상속되는 모든 클래스는 코드의 다른 부분에서 일종의 "태그"로 사용될 수 있습니다. 예를 들어 ObsoleteAttribute라는 특성이 있습니다.

[Obsolete]
public class MyClass
{
}

이 클래스는 ObsoleteAttribute로 지칭되지만 코드에서 [Obsolete]를 사용하는 데만 필요합니다. 이것이 C#에서 준수하는 규칙입니다. 원할 경우 전체 이름 [ObsoleteAttribute]를 사용할 수 있습니다.

이 문자열은 var attr = new ObsoleteAttribute("some string")를 작성하는 것처럼 ObsoleteAttribute 생성자에 인수로 전달됩니다.

특성 생성자에 대한 매개 변수는 단순 형식/리터럴인 bool, int, double, string, Type, enums, etc 및 해당 형식의 배열로 제한됩니다. 식 또는 변수는 사용할 수 없습니다. 위치 또는 명명된 매개 변수는 얼마든지 사용할 수 있습니다.

 

커스텀 Attribute

public class MySpecialAttribute : Attribute
{
}

ObsoleteAttribute 트리거 같은 .NET 기본 클래스 라이브러리의 특성은 컴파일러 내에 특정 동작을 포함합니다. 그러나 만드는 특성은 메타데이터의 역할만 수행하며 특성 클래스 내의 코드는 실행되지 않습니다. 코드의 임의 위치에서 해당 메타데이터에 대해 작업을 수행할 수 있습니다

 

커스텀 Attribute 사용하는 법

특성는 메타데이터로 작동합니다. 외부 영향이 없으면 어떤 작업도 수행하지 않습니다.

특성을 찾아 작업을 수행하려면 일반적으로 리플렉션이 필요합니다. 이 자습서에서는 리플렉션을 자세히 다루지 않겠지만, 기본 개념은 리플렉션을 사용하면 다른 코드를 검사하는 코드를 C#에서 작성할 수 있다는 것입니다.

var attrs = typeInfo.GetCustomAttributes();
foreach(var attr in attrs)
    Console.WriteLine("Attribute on MyClass: " + attr.GetType().Name);

 

해당 내용은 콘솔에 Attribute on MyClass: ObsoleteAttribute와 같이 표시됩니다. MyClass에 다른 특성을 추가해 보세요.

이러한 Attribute 개체가 지연되어 인스턴스화되는 것에 유의해야 합니다. 즉, GetCustomAttribute 또는 GetCustomAttributes를 사용해야만 인스턴스화됩니다. 또한 매번 인스턴스화되기도 합니다. GetCustomAttributes를 연속해서 2번 호출하면 2개의 다른 ObsoleteAttribute 인스턴스가 반환됩니다.

 

알게된점

Attribute는 그 자체로는그냥 메타데이터 역할밖에는 못하는구나

어디서 리플렉션해서 사용을 해야 비로서 작동하는구나

내가 그의 이름을 불러 주기 전에는
그는 다만
하나의 몸짓에 지나지 않았다.

내가 그의 이름을 불러 주었을 때,
그는 나에게로 와서
꽃이 되었다.