Я хочу вызвать конструктор через .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. Я не могу получить объект с отражением, потому что ничего в библиотеке не реализует интерфейс. Есть ли способ создать объект, который реализует интерфейс и передать его конструктору?
В настоящее время я использую Windows Forms с Visual Studio 2008, это проект C#, который нацелен на инфраструктуру .Net2.0. Но я рад принять любое решение.
Редактировать: Извините, я не указал проблему в полном контексте. Два фрагмента кода находятся в разных сборках. Сборка, содержащая второй фрагмент кода, не имеет ссылки на первую dll, она просто загружает сборку с отражением. Если я просто пишу
public class MyStringGetter : IStringGetter
компилятор выдает ошибку, потому что IStringGetter не известно во время компиляции.
Edit2: Несмотря на то, что это не то, что я надеялся, я думаю, что ответ: Не делать
Даже создание собственного класса заглушки, у которого есть только пустые объявления метода интерфейса, может быть достаточно, чтобы идти, и не нуждался бы в насмешливой структуре. Просто создайте свой собственный вложенный класс TestStringGetter, который реализует интерфейс, создаст экземпляр и передаст его в Invoke. – 2010-12-08 09:36:00
Да, я буквально не хотел использовать рамки Mocking. Любой простой макет. Как сказал Тим. – decyclone 2010-12-08 09:42:54
Просто, чтобы быть уверенным, что я понимаю вас: В новой сборке, содержащей класс, реализующий интерфейс, я должен включить ссылку на ClassLibrary1.dll, чтобы я мог просто использовать «нормальное» наследование? – 2010-12-08 13:56:42