인터페이스를 매개 변수로 사용하는 .Net 리플렉션을 통해 생성자를 호출하려고합니다..Net Reflection : 인터페이스를 매개 변수로 사용하는 생성자를 호출하는 방법
public interface IStringGetter
{
string GetString();
}
public class Class1
{
private IStringGetter _stringGetter;
public Class1(IStringGetter stringGetter)
{
_stringGetter = stringGetter;
}
public String GetString()
{
return _stringGetter.GetString();
}
}
반사와이 클래스를 사용하는 코드는 다음과 같습니다 :
Assembly asm = Assembly.LoadFrom(@"c:\temp\ClassLibrary1.dll");
Type tClass1 = asm.GetType("ClassLibrary1.Class1");
Type tStringGetter = asm.GetType("ClassLibrary1.IStringGetter");
ConstructorInfo ci = tClass1.GetConstructor(new Type[ ] { tStringGetter });
// object obj = ci.Invoke(new object[ ] { *what goes here?* });
그리고 지금은 필요성 IStringGetter 인터페이스를 구현하는 객체이 클래스의 코드는 다음과 같이 보입니다. 리플렉션을 사용하여 객체를 얻을 수는 없습니다. 라이브러리의 어떤 것도 인터페이스를 구현하지 않기 때문입니다. 인터페이스를 구현하고 그것을 생성자에 전달하는 객체를 만드는 방법이 있습니까?
지금 Visual Studio 2008과 함께 Windows Forms를 사용하고 있습니다.이 프로젝트는 .Net2.0 프레임 워크를 대상으로하는 C# 프로젝트입니다. 그러나 나는 어떤 해결책이라도 받아 들여서 기쁘다.
편집 : 죄송합니다. 전적으로이 문제를 밝히지 않았습니다. 두 코드 스 니펫은 서로 다른 어셈블리에 있습니다. 두 번째 코드 조각이 들어있는 어셈블리에 첫 번째 dll에 대한 참조가 없으므로 어셈블리를 리플렉션으로로드하면됩니다. 난 그냥
public class MyStringGetter : IStringGetter
를 작성하는 경우 IStringGetter가 컴파일 타임에 알려져 있지 않기 때문에 컴파일러에서 오류가 발생합니다.
Edit2가 : 그것은 내가 바라는 것은 아니지만, 나는 대답은 생각 : 이 인터페이스를 구현 Assembly
의 클래스가없는 경우
당신이 옳다고 생각합니다. 분명히 나는 이것을 지상에서 설계하지 않는다. 나는 리플렉션을 염두에 두지 않은 오래된 코드를 사용해야한다. 그러나이 솔루션이 리플렉션 외에도 동적 코드 생성 또는 조롱 라이브러리가 필요한 경우 전체 접근 방식을 다시 디자인하는 것이 올바른 방법이라고 생각합니다. 코드에 대해 어느 정도 통제권을 가지고 있기 때문에 가능한 일입니다. –