C# Apps .NET Reflection 

2017.06.18 15:28

가을의곰 조회 수:176

 

.NET Reflection 
 

.NET Reflection은 .NET 객체의 클래스 타입, 메서드, 프로퍼티 등의 메타 정보를 런타임 중에 알아내는 기능을 제공한다. 또한, 이러한 메타 정보를 얻은 후, 직접 메서드를 호출하거나 프로퍼티를 변경하는 등의 작업도 가능하다. 물론 객체에서 메서드를 직접 호출하는 경우가 더 빠르겠지만, 어떤 경우는 런타임중에 이런 메타 정보가 동적으로 알아낼 필요가 있다. 예를 들어, 테스트 어셈블리에 있는 테스트 클래스들의 Public 메서드를 선별해서 이를 동적으로 호출하는 경우라든가, 특정 클래스 안에 지정된 이름의 멤버가 있는지 판단하는 경우 등등에 .NET Reflection이 활용될 수 있다. 
 

 


.NET Reflection을 이용한 프로퍼티 설정 
 

.NET Reflection을 이용해서 많이 사용되는 케이스의 하나로 프로퍼티를 접근하는 경우를 들어 보자. 클래스의 프로퍼티 정보를 얻기 위해서 우선 .NET 클래스를 GetType() 등의 메서드를 써서 알아낸 후, 클래의 특정 속성정보를 알기 위해 Type.GetProperty()라는 메서드를 호출한다. 클래스가 가진 모든 프러퍼티를 가져오기 위해서는 GetProperties()라는 메서트를 호출하면 된다. 아래의 예제는 해당 객체가 Name이라는 속성을 가지고 있는지 체크해서, 만약 있으면, 특정 값을 그 속성에 설정하는 예이다. 
 

예제

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을 이용한 메서드 호출 
 

.NET Reflection을 이용해서 메서드 프로토타입 즉, 함수 인자, 리턴값 등의 메타 정보를 읽어 오는 것이 가능하며, 이를 통해 직접 그 메서드를 호출하는 것이 가능하다. 특정 메서드 정보를 얻기 위해서 Type.GetMethod()를 호출하고, 모든 메서드 정보를 가져오기 위해서는 GetMethods()를 호출한다. 아래의 예제는 해당 객체가 MyMethod이라는 메서드를 가지고 있는지 체크해서, 만약 있으면 해당 메서드를 호출하는 예이다. 
 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

예제

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");
    }
}


 


참조 : Reflection을 이용한 클래스 객체 생성 / Generic Type으로 부터의 객체

 

[출처] http://www.csharpstudy.com/Practical/Prac-reflection.aspx

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
24 윈도우즈 마켓 앱 스토어 개발 안내서  가을의곰 2017.06.18 154
23 Assembly.GetType 메서드 file 가을의곰 2017.06.18 140
22 Executing Code in Another Application Domain (C# Programming Guide) 가을의곰 2017.06.18 142
21 1. 리플렉션(Reflection) 가을의곰 2017.06.18 159
» .NET Reflection  가을의곰 2017.06.18 176
19 C# - Interfaces 가을의곰 2017.06.18 151
18 C# 인터페이스  가을의곰 2017.06.18 262
17 Public Key Tokens with sn 졸리운_곰 2017.05.27 188
16 [C#] 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. [출처] C# : 오류 System.NullReferenceException: 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.(오류 System.NullReferenceException) 졸리운_곰 2017.05.27 2354
15 private, public, protected 그리고 internal?? 접근 한정자에 대해 알아보자. 졸리운_곰 2017.05.27 163
14 [.NET Framework] .NET : 368. 닷넷의 어셈블리 서명 데이터 확인 방법 [링크 복사], [링크+제목 복사] file 졸리운_곰 2017.05.27 331
13 [Tips] Visual Studio 에서 특정 어셈블리의 PublicKeyToken 찾는 법 졸리운_곰 2017.05.27 409
12 .net의 publickeytoken 찾는 sn 프로그램 경로 졸리운_곰 2017.05.27 213
11 예외 문제 해결: System.BadImageFormatException 졸리운_곰 2017.05.27 932
10 A replacement for MemoryStream file 졸리운_곰 2017.05.20 197
9 [.net] jni4net 을 이용하여 c# .net 에서 .jar 파일 사용하기 file 졸리운_곰 2017.04.26 384
8 A Simple Crawler Using C# Sockets file 졸리운_곰 2017.04.24 273
7 ILSpy 닷넷 어셈블리 디컴파일러 오픈 소스 file 졸리운_곰 2017.04.22 428
6 C# WinForm "인증서 저장소에서 매니페스트 서명 인증서를 찾을 수 없습니다." file 졸리운_곰 2017.03.18 741
5 Getting started with SQLite in C# file 졸리운_곰 2017.03.18 286
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED