일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 최적화
- unity
- 2D Camera
- sha
- ui
- C#
- AES
- Job 시스템
- Custom Package
- Tween
- 가이드
- 다이나믹 폰트
- 이미지 폰트
- DotsTween
- Sprite Atlas
- TextMeshPro
- job
- 샘플
- 암호화
- Dots
- RSA
- Unity Editor
- 커스텀 패키지
- Framework
- Dynamic Font
- 단말기 해상도
- 프레임워크
- base64
- 텍스트 메시 프로
- adfit
- Today
- Total
EveryDay.DevUp
[Unity] 특성 ( Attribute Class ) - 1 본문
* 특성
- Attribute 클래스는 미리 정의된 시스템 정보 또는 사용자가 정의한 정보를 대상 요소와 결합하여 메타데이터에 저장
- 메타 데이터에 저장된 정보를 런타임에서 참조하여 특별한 기능을 수행할 수 있음
- 모든 특성 형식은 Attribute 클래스에서 직간접적으로 파생됨
https://docs.microsoft.com/ko-kr/dotnet/api/system.attribute?view=netstandard-2.0
Attribute 클래스 (System)
사용자 지정 특성에 대한 기본 클래스를 나타냅니다.
docs.microsoft.com
- 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
AttributeUsageAttribute 클래스 (System)
다른 특성 클래스의 사용을 지정합니다. 이 클래스는 상속될 수 없습니다.
docs.microsoft.com
: https://docs.microsoft.com/ko-kr/dotnet/api/system.attributetargets?view=netstandard-2.0
AttributeTargets 열거형 (System)
특성을 적용하는 데 유효한 애플리케이션 요소를 지정합니다.
docs.microsoft.com
[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에 특성이 정의된 것을 확인할 수 있음
'C#' 카테고리의 다른 글
[C#] var 키워드 (0) | 2023.11.09 |
---|---|
[Unity] C# 최적화 - Part1 (0) | 2023.10.02 |
[Unity] .Net 디컴파일 ( JetBrain DotPeek ) (0) | 2021.12.30 |
[Unity] 메서드 매개 변수 ( 값 형식, 참조 형식, in, out, ref, params ) (0) | 2021.12.28 |
[Unity] 액세스 한정자 ( public, protected, internal, private ) (2) | 2021.12.27 |