我想通过.Net反射调用一个构造函数,它将接口作为参数。这个类的代码看起来是这样的:.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窗体与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