2014-03-27 33 views
1

我的通用方法是這樣的如何傳遞一個對象類型調用一個泛型方法

public static class AppContainerInstaller 
{ 
    public static IMessageHandler<T> Resolve<T>() 
    { 
     return _container.Resolve<IMessageHandler<T>>(); 
    } 
} 

我試圖從不同的類調用這個通用方法

public static string ProcessMessage(IMessage message) 
{ 
    messageHandler = AppContainerInstaller.Resolve<message.GetType()>(); 
    // THe previous line throws an error. 
    return messageHandler.Handle(message); 
} 

誰能告訴我怎麼樣將消息的類型傳遞給泛型方法?

+0

通用類型需要在編譯時已知(Resolve )。 – Dunken

回答

1

有兩種方式來獲得運行時類型:傳遞消息作爲一個參數或使用反射。

修改方法:

public static IMessageHandler<T> Resolve<T>(T unused) 
{ 
    return _container.Resolve<IMessageHandler<T>>(); 
} 

,這將允許運行時類型查找:

// Cast to dynamic to force runtime type 
messageHandler = AppContainerInstaller.Resolve((dynamic) message); 

您也可以使用反射雖然有性能損失。

private static readonly MethodInfo ResolveMethodInfo 
    = typeof(AppContainerInstaller).GetMethod("Resolve", BindingFlags.Public | BindingFlags.Static); 

// Assuming there exists a non-generic interface IMessageHandler 
private readonly ConcurrentDictionary<Type, Func<IMessageHandler>> _methodCache 
    = new ConcurrentDictionary<Type, Func<IMessageHandler>>(); 

public static string ProcessMessage(IMessage message) 
{ 
    messageHandler = Resolve(message.GetType()); 
    return messageHandler.Handle(message); 
} 

private IMessageHandler Resolve(Type type) 
{ 
    // Cache the generated method to avoid repeated reflection penalty. 
    var resolve = _methodCache.GetOrAdd(type,() => ResolveMethodInfo.MakeGenericMethod(type)); 
    return resolve(); 
} 
5

你必須這樣做:

messageHandler = AppContainerInstaller.Resolve<IMessage>(); 

Resolve方法是誰應該得到的類型中T.你看,使用泛型的時候,你必須提供你可能需要一個實際的type.And通過了一個要更改Resolve以獲取T參數,所以您可以通過message。事情是這樣的:

public static IMessageHandler<T> Resolve<T>(T param) 

,你這樣稱呼它:

messageHandler = AppContainerInstaller.Resolve<IMessage>(message); 
相關問題