Я хочу вызвать конструктор через отражение .Net, которое принимает интерфейс в качестве параметра. Код для этого класса выглядит примерно так:
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. Я не могу получить объект с отражением, потому что ничто в библиотеке не реализует интерфейс. Есть ли способ создать объект, который реализует интерфейс и передать его конструктору?
Сейчас я использую Windows Forms с Visual Studio 2008, это проект C #, предназначенный для .Net2.0 framework. Но я рад принять любое решение.
Редактировать : Извините, я не указал проблему в полном контексте. Два фрагмента кода находятся в разных сборках. Сборка, содержащая второй фрагмент кода, не имеет ссылки на первую DLL, она просто загружает сборку с отражением. Если я просто напишу
public class MyStringGetter : IStringGetter
компилятор выдает ошибку, потому что IStringGetter не известен во время компиляции.
Edit2 : Хотя это не то, на что я надеялся, я думаю, что ответ: Не делайте этого