2014-11-24 1 views
0

Giggles이라는 이름의 Foobar 클래스가 있습니다. 동일한 네임 스페이스에있는 또 다른 클래스는 Monkey입니다. 둘 다 같은 모임에있어.런타임에 내부 생성자를 사용하여 클래스를 인스턴스화합니다.

Monkey은 다음과 같습니다

와 나는 그것의 소스 코드를 변경할 수있다 Monkey 유일한 생성자입니다
namespace Foobar { 
    public class Monkey { 
     internal Monkey() { } 
     ... 

.

이제 Giggles의 메서드 내에서 클래스 이름이 포함 된 문자열을 사용하여 Monkey을 인스턴스화하려고합니다.

이 작동하지 않습니다

var className = "Foobar.Monkey"; 
var monkley = Assembly.GetExecutingAssembly().CreateInstance(className); 

이 예외 메시지를 제공합니다 : 예외 유형 System.MissingMethodException의와 "Constructor on type 'Foobar.Monkey' not found.".

아이디어가 있으십니까?

+1

'new Monkey()'에 무슨 문제가 있습니까? – BradleyDotNET

+0

값이 클래스 이름 인 문자열에서 '원숭이'를 만듭니다. – core

+1

하나 또는 몇 개의 특정 어셈블리에서 '원숭이'가 필요하면 [InternalsVisibleTo] (http://geekswithblogs.net/jwhitehorn/archive/2007/11/09/116750.aspx)를 사용할 수 있습니다. – Jonesopolis

답변

1

당신은 당신을 위해 작동해야 적절한 바인딩 플래그

/* bindings are: non public and instance to find an internal ctor */ 
ConstructorInfo monkeyCtor = typeof(Monkey).GetConstructors 
      (BindingFlags.Instance | BindingFlags.NonPublic)[0]; 

/* actual invokation of constructor*/ 
Monkey monkeyInstance = (Monkey) monkeyCtor.Invoke(...); 

Type.GetConstructors를 사용하려고 할 수 있습니다.

관련 문제