我想通過.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