簡體   English   中英

如何傳遞對象類型以調用泛型方法

[英]How to pass an object type to call a generic method

我的通用方法是這樣

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);
}

誰能告訴我如何將消息類型傳遞給通用方法?

您必須這樣做:

messageHandler = AppContainerInstaller.Resolve<IMessage>();

Resolve方法是應該在T中傳遞類型的方法。您看到,使用泛型時,必須提供一個實際的類型。您可能想更改Resolve以獲取T參數,以便傳遞message 像這樣:

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

您這樣稱呼它:

messageHandler = AppContainerInstaller.Resolve<IMessage>(message);

有兩種獲取運行時類型的方法:將消息作為參數傳遞或使用反射。

修改方法:

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM