如何注册嵌套泛型类型?解决“Unexpected use of an unbound generic name”错误
解决泛型服务注册时“意外使用未绑定泛型名称”的错误
问题场景
我尝试注册泛型命令处理程序:
services.AddTransient(typeof(IRequestHandler<MyCommand<>>), typeof(MyCommandHandler<>));
编译器抛出错误:
Unexpected use of an unbound generic name
我的命令处理程序定义如下:
public class MyCommandHandler<T> : IRequestHandler<MyCommand<T>> where TPayload : class
错误出现在typeof(IRequestHandler<UitvalCommand<>>)这段代码中(注:此处应为笔误,与前文MyCommand对应)
问题原因
C#不支持直接使用嵌套的未绑定泛型类型(比如IRequestHandler<MyCommand<>>)来获取Type对象。MyCommand<>属于未绑定泛型,将其作为另一个泛型接口的类型参数时,编译器无法直接解析这种写法。
解决方案
需要通过Type.MakeGenericType方法手动构造嵌套的泛型类型:
// 获取未绑定的泛型接口和命令类型 var requestHandlerType = typeof(IRequestHandler<>); var myCommandType = typeof(MyCommand<>); // 构造IRequestHandler<MyCommand<>>的Type对象 var genericHandlerType = requestHandlerType.MakeGenericType(myCommandType); // 注册泛型服务 services.AddTransient(genericHandlerType, typeof(MyCommandHandler<>));
这样就能实现“不指定具体泛型参数注册泛型类型”的需求。另外注意你的MyCommandHandler<T>定义里的约束写的是where TPayload : class,这里大概率是笔误,建议改成where T : class以匹配泛型参数逻辑。
内容的提问来源于stack exchange,提问作者Martijn
相关产品推荐
相关产品推荐

