본문 바로가기
IT Study/C#

[C#] 리플렉션(Reflection), 애트리뷰트(Attribute)

by dev_huhu 2021. 3. 4.
반응형

리플렉션 (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

댓글