C #에서 리플렉션을 사용하는 방법

C #의 리플렉션은 런타임에 형식에 대한 메타 데이터를 검색하는 데 사용됩니다. 즉, 리플렉션을 사용하여 프로그램에있는 형식의 메타 데이터를 동적으로 검사 할 수 있습니다.로드 된 어셈블리와 여기에 정의 된 형식에 대한 정보를 검색 할 수 있습니다. C #의 리플렉션은 C ++의 RTTI (런타임 유형 정보)와 유사합니다.

.Net에서 리플렉션을 사용하려면 프로그램에 System.Reflection 네임 스페이스를 포함해야합니다. 리플렉션을 사용할 때 어셈블리, 형식 또는 모듈을 나타내는 데 사용할 수있는 "형식"형식의 개체를 가져옵니다. 리플렉션을 사용하여 유형의 인스턴스를 동적으로 만들고 해당 유형의 메서드를 호출 할 수도 있습니다.

System.Reflection 네임 스페이스에 정의 된 형식은 다음과 같습니다.

  • 어셈블리
  • 기준 치수
  • 열거 형
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • 유형
  • FieldInfo
  • EventInfo
  • PropertyInfo

이제 반성을 행동으로 옮기기 위해 몇 가지 코드를 파헤쳐 보겠습니다. Customer라는 다음 클래스를 고려하십시오.

public class Customer

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

    }

다음 코드 조각은 리플렉션을 사용하여 클래스 이름과 Customer 클래스의 네임 스페이스 이름을 가져 오는 방법을 보여줍니다.

Type type = typeof(Customer);

Console.WriteLine("Class: " + type.Name);

Console.WriteLine("Namespace: " + type.Namespace);

다음 코드 조각은 Customer 클래스의 속성 목록을 검색하고 해당 이름을 콘솔 창에 표시하는 방법을 보여줍니다.

static void Main(string[] args)

        {

            Type type = typeof(Customer);

            PropertyInfo[] propertyInfo = type.GetProperties();

            Console.WriteLine("The list of properties of the Customer class are:--");

            foreach (PropertyInfo pInfo in propertyInfo)

            {

                Console.WriteLine(pInfo.Name);

            }

        }

Type 클래스의 GetProperties () 메서드는 PropertyInfo 유형의 배열을 반환합니다. 이는 실제로 유형의 공용 속성 목록입니다. 그런 다음이 배열을 반복하고 유형에 정의 된 각 공용 속성의 이름을 검색 할 수 있습니다. Customer 클래스는 세 가지 속성을 정의하므로이 프로그램이 실행되면이 세 가지 속성의 이름이 모두 콘솔에 표시됩니다.

리플렉션을 사용하여 생성자의 메타 데이터와 형식의 공용 메서드를 표시하는 방법은 다음과 같습니다. 앞서 만든 Customer 클래스를 다시 방문하여 기본 생성자와 매개 변수로 전달 된 고객 개체의 유효성을 검사하는 데 사용되는 Validate라는 두 가지 메서드를 통합 해 보겠습니다. Customer 클래스의 수정 된 버전은 다음과 같습니다.

public class Customer

    {

        public Customer()

        {

            //Default constructor

        }

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

        public bool Validate(Customer customerObj)

        {

            //Code to validate the customer object

            return true;

        }

    }

다음 코드 조각을 사용하여 Customer 클래스에 속한 모든 생성자의 이름을 표시 할 수 있습니다. Customer 클래스에는 생성자가 하나만 있으므로 하나만 나열됩니다.

Type type = typeof(Customer);           

ConstructorInfo[] constructorInfo = type.GetConstructors();

Console.WriteLine("The Customer class contains the following Constructors:--");

foreach (ConstructorInfo c in constructorInfo)

  {

     Console.WriteLine(c);

  }

Type 클래스의 GetConstructors () 메서드는 반영되는 형식에 정의 된 모든 공용 생성자의 목록을 포함하는 ConstructorInfo 형식의 배열을 반환합니다.

확인; 이제 Customer 클래스의 모든 공용 메서드 이름을 표시해 보겠습니다. 다시 한 번, 하나만 있으므로 다음에 주어진 프로그램이 실행될 때 하나의 메서드 이름 만 콘솔에 표시됩니다. 다음은 참조 용 코드 목록입니다.

static void Main(string[] args)

 {

    Type type = typeof(Customer);

    MethodInfo[] methodInfo = type.GetMethods();

     Console.WriteLine("The methods of the Customer class are:--");

            foreach (MethodInfo temp in methodInfo)

            {

              Console.WriteLine(temp.Name);               

            }

            Console.Read();

        }

몇 가지 추가 메서드 (ToString, Equals, GetHashCode, GetType)의 이름도 표시 될 수 있습니다. 이러한 메서드는 Object 클래스에서 상속됩니다. .Net의 모든 클래스는 기본적으로 Object 클래스를 파생합니다.

메서드의 속성을 반복 할 수도 있습니다. 메서드에 대해 사용자 지정 특성이 정의 된 경우 MethodInfo 클래스의 인스턴스에서 GetCustomAttributes 메서드를 사용하여 메서드의 특성을 검색 할 수 있습니다. 이를 달성하는 방법은 다음과 같습니다.

foreach (MethodInfo temp in methodInfo)

 {

    foreach (Attribute attribute in temp.GetCustomAttributes(true))

     {

         //Write your usual code here

     }

  }

따라서 애플리케이션에서 속성을 사용하여 비즈니스 오브젝트를 장식하는 경우 리플렉션을 활용하여 유형을 반영하고 유형의 메소드 속성을 검색 한 다음 그에 따라 몇 가지 조치를 수행 할 수 있습니다.