[英]Structuremap returning wrong instance for open generic type?
我正在嘗試使用帶有開放式泛型的結構圖在運行時獲取事件處理程序的實例,我正在使用基於開放式泛型的配置
// #1 Configuration
scan.ConnectImplementationsToTypesClosing(typeof(IHandle<>));
// #2 Actual class
public class EventHandlerClass :
IHandle<MyEvent>,
IHandle<AnotherEvent>,
IHandle<ThirdEvent>,
{
void IHandle<MyEvent>.Handle(MyEvent args)
{
}
void IHandle<AnotherEvent>.Handle(AnotherEvent args)
{
}
void IHandle<ThirdEvent>.Handle(ThirdEvent args)
{
}
}
我的代碼適用於需要通過構造函數注入來請求依賴關系的情況,例如這樣很好。
public MyClass(IHandle<MyEvent>[] alleventHandlers)
{
}
但是,在我的一種情況下,我需要在運行時獲取依賴項。 以下是我正在使用的代碼
// Code
Type t = typeof(IHandle<>);
MyEvent m = new MyEvent();
var generic = t.MakeGenericType(m.GetType());
dynamic instances = nestedContainer.GetAllInstances(genType) as IEnumerable;
foreach( dynamic inst in instances)
{
inst.Handle(m)
}
我收到以下錯誤。 {“與'MyNameSpace.EventHandlerClass.Handle(MyNameSpace.Events.ThirdEvent)'最佳的重載方法匹配有一些無效的參數“”}
盡管我以正確的類型調用了GetAllInstances,但GetAllInstances似乎以某種方式返回了帶有Handle方法的EventHandlerClass對象,該事件期望ThirdEvent事件。
這是一個錯誤嗎? 還是我在配置上犯了一個錯誤?
動態變量只能訪問類型方法(通常是公共方法,但基於上下文)。 它無權訪問已明確實現的接口方法。 調用顯式接口實現的唯一方法是將對象強制轉換為接口。
因此,您有兩個選擇,要么a)按照@Yacoub的建議隱式實現接口,要么b)使用反射調用該方法。
foreach(dynamic inst in instances)
{
Type type = inst.GetType();
Type interfaceType = type.GetInterfaces().Single(t => t == generic);
interfaceType.GetMethod("Handle").Invoke(inst, new object[] { m });
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.