리플렉션 (Reflection)
: 런타임에 클래스나 객체의 타입 정보를 조사하는 기능
- 보통 컴파일러에 의해 기계어로 바뀌고 나면 사라지지만, C#은 컴파일된 결과 코드뿐만 아니라 타입에 대한 메타 데이터를 실행 파일에 같이 기록해놓기 때문에 실행 중에도 정보를 조사할 수 있다.
- 루트 클래스인 Object에 있는 GetType() 메서드를 통해 얻은 Type 객체를 통해 수행이 가능하다.
Type 객체를 얻는 방법
1. 루트 클래스인 Object의 GetType 메서드를 호출한다.
- 정적 메서드가 아니므로 객체가 있어야 호출 가능하다.
객체.GetType()
2. Type의 정적 메서드인 GetType 메서드를 호출한다.
- 클래스 이름(문자열)으로 정보를 조사하므로 객체가 없어도 호출이 가능하다.
Type.GetType("System.String")
3. typeof 연산자를 사용하여 인수로 클래스명을 전달
- 클래스 이름으로 정보를 조사하므로 객체가 없어도 호출이 가능하다.
typeof(System.String)
사용자 정의 애트리뷰트
- 여러 개의 데이터형 라벨을 지정하기 위해 ' | ' 구분자 사용
- 커스텀 어트리뷰트는 Attribute 클래스를 상속받아야 하며, 클래스 이름이 ~ Attribute로 끝나는 것이 좋다 (접미사 생략 가능)
- ValidOn : 위치 지정 파라미터; 적용 가능한 요소값을 지정한다.
- AllowMultiple : 한 대상에 여러 번 적용할 수 있는지를 지정한다. (디폴트는 false)
- Inherited : 파생되는 클래스나 재정의되는 메서드에도 적용할 것인가를 지정한다. (디폴트는 true)
- 사용 예시
// 어트리뷰트 선언 (정의)
// 클래스와 메서드를 타겟으로만 사용 가능
// 중복 허용, 상속 불가능
[System.AttributeUsage(AttributeTargets.Class |
AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
public class ExampleAttribute : Attribute {
}
멤버 | 적용 |
All | 모든 요소 |
Assembly | 어셈블리 |
Class | 클래스 |
Constructor | 생성자 |
Delegate | 델리게이트 |
Enum | 열거형 |
Event | 이벤트 |
Field | 필드 |
GenericParameter | 제네릭 인수 |
Interface | 인터페이스 |
Method | 메서드 |
- 어트리뷰트 선언
[AttributeUsage(AttributeTargets.Class)]
public class PersonInfo : Attribute {
private string _name;
private string _phoneNumber;
public PersonInfo(string name, string phoneNumber) {
this._name = name;
this._phoneNumber = phoneNumber;
}
public string Name
{
get { return this._name; }
}
public string PhoneNumber
{
get { return this._phoneNumber; }
}
}
- 어트리뷰트 사용
[PersonInfo("허씨", "010-1234-5678")]
public class Person {
}
- 어트리뷰트 정보 얻기 (리플렉션)
class Program
{
static void Main(string[] args)
{
Type type = typeof(Person);
foreach (Attribute attr in type.GetCustomAttributes(true))
{
PersonInfo pi = attr as PersonInfo;
if (pi != null)
{
Console.WriteLine("이름은 {0} \n" +
"전화번호는 {1}", pi.Name, pi.PhoneNumber);
}
}
}
}
- 실행 화면
'IT Study > C#' 카테고리의 다른 글
[C#] XML Convert to CSV (0) | 2021.03.13 |
---|---|
[C#] MDI (Multiple Document Interface) (0) | 2021.03.13 |
[C#] 확장 메서드, 람다 (0) | 2021.01.25 |
[C#] 프로퍼티(Property), 익명 타입 (0) | 2021.01.25 |
[C#] 암묵적 타입 (0) | 2021.01.25 |
댓글