본문 바로가기

Language/C#

.NET Reflection

.NET Reflection


.NET Reflection은 .NET 객체의 class type, method, property등의 meta information을 runtime중에 알아내는 기능을 제공한다.

또한, 이러한 meta information을 얻은 후 직접 method를 호출하거나 property를 변경하는 등의 작업도 가능하다.

물론 객체에서 method를 직접 호출하는 경우가 더 빠르겠지만 어떤 경우는 runtime중에 이런 meta information을 동적으로 알아낼

필요가 있다.

예를들어 test assembly에 있는 test class들의 public method를 선별해서 이를 동적으로 호출하는 경우라든가

특정 class안에 지정된 이름의 member가 있는지 판단하는 경우 등이 있다.




.NET Reflection을 이용한 property 설정


class의 property informationd르 얻기 위해서 우선 .NET class  GetType()등의 method를 써서 알아낸 후

class의 특정 속성정보를 알기 위해 Type.GetProperty( )라는 method를 호출하면 된다.

Class가 가진 모든 property를 가져오기 위해서는 GetProperties()라는 method를 호출하면 된다.



    
class Program
{
    static void Main(string[] args)
    {
        MyClass1 m1 = new MyClass1();
        SetDefaultName(m1);
        Console.WriteLine(m1.Name);
    }
    
    static void SetDefaultName(object myObject)
    {
        // Name이라는 속성이 있는지?
        PropertyInfo pi = myObject.GetType().GetProperty("Name");

        // 있으면 속성값 설정
        if (pi != null)
        {
            pi.SetValue(myObject, "Lee", null);
        }
    }
}

class MyClass1
{
    public string Name { get; set; }
}



.NET Reflection을 이용한 method 호출


.NET Reflection을 이용해서 method prototype 즉, 함수 인자, 리턴값 등 meta information을 읽어 오는것이 가능하며

이를 통해 직접 그 method를 호출하는 것이 가능하다.

특정 method information을 얻기 위해서 Type.GetMethod()를 호출하고, 모든 method information를 가져오기 위해서는

GetMethods()를 호출한다.



    
class Program
{
    static void Main(string[] args)
    {
        MyClass1 m1 = new MyClass1();
        MyClass2 m2 = new MyClass2();
        MyClass3 m3 = new MyClass3();

        MyFunc(m1);
        MyFunc(m2);
        MyFunc(m3);
    }

    static void MyFunc(object myObject)
    {
        // 해당 객체가 MyMethod라는 메서드를 가지고 있는지
        MethodInfo mi = myObject.GetType().GetMethod("MyMethod");
        if (mi != null)
        {
            // 만약 메서드가 있으면, 호출
            mi.Invoke(myObject, null);
        }
        else
        {
            Console.WriteLine(myObject.GetType().Name +
             ": MyMethod not found");
        }
    }

}

// 아래는 테스트 클래스들
class MyClass1
{
    public void MyMethod()
    {
        Console.WriteLine("MyClass1.MyMethod");
    }
}

class MyClass2
{
    public void MyMethod()
    {
        Console.WriteLine("MyClass2.MyMethod");
    }
}

class MyClass3
{
    public void DifferentMethod()
    {
        Console.WriteLine("MyClass3.DifferentMethod");
    }
}







참고


http://www.csharpstudy.com/Practical/Prac-reflection.aspx




'Language > C#' 카테고리의 다른 글

강한참조 / 약한참조(WeakReference)  (0) 2019.03.13
Generalization  (0) 2019.03.06
Boxing / UnBoxing  (0) 2019.03.06
Collection의 성능문제 / Generic Collection  (0) 2019.03.06
C# 제네릭  (0) 2019.03.06