如何在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类型,建议额外抽取非泛型基接口规避反射调用的成本:
- 先定义所有Handler通用的非泛型基接口
public interface IMessageHandler { void Execute(object inputData); }
- 让原有泛型接口继承该非泛型接口
public interface IMessageHandler<T> : IMessageHandler { void Execute(T inputData); }
- 实现类中显式实现非泛型方法做类型转发
public class AmendDataTypeHandler : IMessageHandler<IAmendDataType> { // 原有泛型业务逻辑实现 public void Execute(IAmendDataType inputData) { // 业务逻辑 } // 非泛型方法显式实现,仅做类型转换转发 void IMessageHandler.Execute(object inputData) { Execute((IAmendDataType)inputData); } }
- 解析后直接转换为非泛型接口调用即可
var handler = (IMessageHandler)IoC.Container.Resolve(closedGenericInterface); handler.Execute(yourBusinessData);
内容的提问来源于stack exchange,提问作者TheoGB
相关产品推荐
相关产品推荐

