You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unity容器中获取泛型参数为运行时Type变量的IMessageHandler<T>实现

解决方案

核心思路是通过C#反射提供的MakeGenericType方法,动态构造出对应DataType的闭合泛型接口类型,再传入Unity的Resolve方法即可:

// 你传入的DataType类型变量
Type dataType = type_variable_containing_the_interface;
// 获取泛型接口的开放类型定义(尖括号内留空代表未绑定具体类型的泛型定义)
Type openGenericInterface = typeof(IMessageHandler<>);
// 构造绑定了具体DataType的闭合泛型接口类型
Type closedGenericInterface = openGenericInterface.MakeGenericType(dataType);
// 直接解析得到对应实现类实例
var handlerInstance = IoC.Container.Resolve(closedGenericInterface);

后续调用优化建议

如果你拿到实例后需要调用Handler的业务方法,因为直接Resolve返回的是object类型,建议额外抽取非泛型基接口规避反射调用的成本:

  1. 先定义所有Handler通用的非泛型基接口
public interface IMessageHandler
{
    void Execute(object inputData);
}
  1. 让原有泛型接口继承该非泛型接口
public interface IMessageHandler<T> : IMessageHandler
{
    void Execute(T inputData);
}
  1. 实现类中显式实现非泛型方法做类型转发
public class AmendDataTypeHandler : IMessageHandler<IAmendDataType>
{
    // 原有泛型业务逻辑实现
    public void Execute(IAmendDataType inputData)
    {
        // 业务逻辑
    }

    // 非泛型方法显式实现,仅做类型转换转发
    void IMessageHandler.Execute(object inputData)
    {
        Execute((IAmendDataType)inputData);
    }
}
  1. 解析后直接转换为非泛型接口调用即可
var handler = (IMessageHandler)IoC.Container.Resolve(closedGenericInterface);
handler.Execute(yourBusinessData);

内容的提问来源于stack exchange,提问作者TheoGB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:30:01