如何传递对象类型以调用泛型方法

本文关键字:调用 泛型方法 类型 何传递 对象 | 更新日期: 2023-09-27 17:54:14

我的通用方法是这个

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