본문 바로가기
C#

.NET C#에서 리플렉션을 사용하여 생성자를 동적으로 호출

by 따봉이 2021. 12. 14.
728x90
반응형

컴파일 타임에 .NET 어셈블리에 액세스할 수 없지만 이 어셈블리에서 코드를 실행하려고 한다고 가정해 보겠습니다. 어셈블리를 동적으로 로드하고 조기 액세스 없이 코드를 실행할 수 있습니다.

여기에서 참조된 어셈블리에서 형식의 생성자를 호출하는 방법을 살펴보겠습니다.

일반적으로 어셈블리에 대한 직접 참조가 있는 경우 'new' 키워드를 사용하여 새 개체를 간단히 초기화할 수 있습니다. 직접 참조가 없으면 불가능합니다.

Visual Studio 2012/2013을 열고 Domain이라는 새 C# 클래스 라이브러리 프로젝트를 만듭니다. 여기에 다음 Customer 클래스를 추가합니다.

 

1
2
4
5
6
7
8
9
10
11
12
public class Customer
{
    private string _name;
 
    public Customer() : this("N/A")
    {}
 
    public Customer(string name)
    {
        _name = name;
    }
}

솔루션을 빌드하고 컴파일된 Domain.dll 라이브러리를 찾습니다 . VS의 컴파일 구성에 따라 bin 폴더 내의 Debug 또는 Release 폴더에 있어야 합니다. .dll을 복사하여 쉽게 찾을 수 있는 기본 드라이브의 다른 위치에 두십시오. 우리는 당신이 다른 소스에서 라이브러리를 얻은 것처럼 가장하고 있지만 어떤 이유로든 컴파일 타임에 라이브러리를 참조할 수 없습니다. 예를 들어 소스는 몇 가지 명명 규칙을 따르는 플러그인으로 앱에 로드되어 코드에서 래핑을 풀고 해당 코드를 호출할 수 있습니다.

 

 

 

VS에서 별도의 프로젝트를 만들고 콘솔 앱으로 만듭니다. 어셈블리  로드하는 방법은 다음과 같습니다 .

1
2
string pathToDomain = @"C:\pathToLib\Domain.dll";
Assembly domainAssembly = Assembly.LoadFrom(pathToDomain);

다음 으로 다음과 같이 전체 이름을 사용하여 고객 유형  파악 합니다.

1
Type customerType = domainAssembly.GetType("Domain.Customer");

다음과 같은 방법으로 Customer의 빈 생성자를 찾을 수 있습니다.

1
2
Type[] emptyArgumentTypes = Type.EmptyTypes;
ConstructorInfo emptyConstructor = customerType.GetConstructor(emptyArgumentTypes);

여기에서 ConstructorInfo에 대해 자세히 알아볼 수 있습니다 . 간단히 말해서 이것은 MethodBase에서 파생되며 유형의 인스턴스를 반환하는 특별한 유형의 메소드인 생성자를 나타냅니다. 위의 코드에서 우리는 빈 유형의 배열을 사용하여 빈 생성자를 원한다고 지정했습니다. 인수 목록의 유형을 제공하여 오버로드된 생성자를 찾을 수도 있습니다.

1
2
Type[] stringArgumentTypes = new Type[] { typeof(string) };
ConstructorInfo stringConstructor = customerType.GetConstructor(stringArgumentTypes);

다음과 같이 이러한 생성자를 호출할 수 있습니다.

1
2
object newEmptyCustomer = emptyConstructor.Invoke(new object[] { });
object newStringCustomer = stringConstructor.Invoke(new object[] { "Elvis" });

F11 키를 사용하여 이 예제를 단계별로 실행하면 코드가 생성자 호출 예제에 도달할 때 Customer 클래스가 VS에 표시되는 것을 볼 수 있습니다.

728x90
반응형

댓글