[Unity] 특성 ( Attribute Class ) - 1
* 특성
- Attribute 클래스는 미리 정의된 시스템 정보 또는 사용자가 정의한 정보를 대상 요소와 결합하여 메타데이터에 저장
- 메타 데이터에 저장된 정보를 런타임에서 참조하여 특별한 기능을 수행할 수 있음
- 모든 특성 형식은 Attribute 클래스에서 직간접적으로 파생됨
https://docs.microsoft.com/ko-kr/dotnet/api/system.attribute?view=netstandard-2.0
- AttributeUsageAttribute는 다른 특성 클래스의 사용상의 제한 조건을 걸 수 있는 특성 클래스
- AttributeUsageAttribute의 생성자는 AttributeTarget을 파라미터로 가지며, 속성으로 제공되는 AllowMultiple, Inherited는 이름 = 값으로 설정할 수 있음
- Attribute 대상 요소는 AttributeUsageAttribute클래스의 AttributeTarget을 통해 설정할 수 있는데, 별도로 설정하지 않으면 모든 대상 요소를 가짐
- Attribute의 대상을 지정하지 않으면, 다음에 나오는 코드에 따라 대상을 설정함. Assembly의 경우 다음 코드가 없기 때문에 특성 사용 시 항상 assembly type이 오는 것을 명시해주어야함
ex) [ method:Attribute] : 대상을 지정할 경우 대상 타켓 : 특성으로 사용
ex) [ AttributeUsage( AttributeTarget.Method, AllowMultiple = true, Inherited = false )] : AttributeTarget외에 파라미터는 '이름=값'으로 설정
- 동일한 특성을 같은 대상에게 여러개 지정하려면 AttributeUsage 클래스의 AllowMultiple을 true로 설정해야하는데, 기본 값은 false
- 특성을 지정한 대상을 상속받는 타입에도 부모의 특성을 주기위해서는 Inherited 값을 true로 설정해야하는데, 기본 값은 true
- 설정한 대상의 대한 정보를 가져올 때는 AttributeUsage으 ValidOn으로 가져올 수 있음
https://docs.microsoft.com/ko-kr/dotnet/api/system.attributeusageattribute?view=netstandard-2.0
: https://docs.microsoft.com/ko-kr/dotnet/api/system.attributetargets?view=netstandard-2.0
[Creator("everyday.devup")]
// CreatorAttribute이지만 뒤의 Attribute는 생략할 수 있음
class Program
{
[method:Creator("everyday.devup")] // 특성 앞에 대상을 정의하여 적용될 대상을 명시할 수 있음
//[return:Creator("everyday.devup")]
// error : AttributeUsage의 타겟을 클래스와 함수로만 설정했기 때문에
// return 타입을 사용할 수 없음
static void Main(string[] args) {
Program pg = new Program();
Type type = pg.GetType();
// Program Class 에 있는 Method 정보를 가져옴
foreach (MethodInfo mInfo in type.GetMethods())
{
// Method에 설정된 속성 정보를 가져옴
foreach (Attribute attr in
Attribute.GetCustomAttributes(mInfo))
{
// 속성 정보 중 CreatorAttribute type을 찾음
if (attr.GetType() == typeof(CreatorAttribute))
{
Console.WriteLine("Method {0}", mInfo.Name);
}
}
}
}
[method: Creator("everyday.devup")]
public void Print() { }
}
[AttributeUsage( AttributeTargets.Class | AttributeTargets.Method , AllowMultiple = true )]
class CreatorAttribute : Attribute
{
string creator;
public CreatorAttribute( string name )
{
creator = name;
}
}
- 특성이 정의된 C# 코드를 컴파일 하여 dll로 만들면, 다음과 같이 Metadata의 CustomAttribute에 특성이 정의된 것을 확인할 수 있음