ASP.NET Core 2.1中注册泛型接口ITrigger<T>的问题求助
解决泛型接口作为委托返回类型的错误
错误原因
你遇到的错误提示Using generic type ITrigger<T> requires 1 type argument,本质是ITrigger<T>是带类型参数的泛型接口,不能直接以ITrigger(不带类型参数)的形式作为委托的返回类型。而你的两个实现类分别对应ITrigger<Admin>和ITrigger<Teacher>,无法用单一的泛型参数统一它们的返回类型。
解决方案:引入非泛型基接口
最稳妥且类型安全的方式是定义一个非泛型的ITrigger基接口,让泛型ITrigger<T>继承它,这样就能用非泛型接口作为委托的返回类型。
1. 修改接口定义
// 非泛型基接口 public interface ITrigger { void Send(object bodyContent); } // 泛型接口继承非泛型接口 public interface ITrigger<T> : ITrigger where T : class { // 用new关键字覆盖基接口的Send方法 new void Send(T bodyContent); }
2. 更新实现类
让实现类显式实现非泛型接口的Send方法,确保类型匹配:
public class AdminTrigger : ITrigger<Admin> { // 实现泛型接口的Send方法 public void Send(Admin bodyContent) { // 你的业务逻辑 } // 显式实现非泛型接口的Send方法 void ITrigger.Send(object bodyContent) { if (bodyContent is Admin admin) Send(admin); else throw new ArgumentException($"无法处理类型为{bodyContent.GetType().Name}的内容", nameof(bodyContent)); } } public class TeacherTrigger : ITrigger<Teacher> { public void Send(Teacher bodyContent) { // 你的业务逻辑 } void ITrigger.Send(object bodyContent) { if (bodyContent is Teacher teacher) Send(teacher); else throw new ArgumentException($"无法处理类型为{bodyContent.GetType().Name}的内容", nameof(bodyContent)); } }
3. 修正服务注册代码
现在可以将委托的返回类型改为非泛型的ITrigger,错误就会消失:
builder.Services.AddSingleton<AdminTrigger>(); builder.Services.AddSingleton<TeacherTrigger>(); builder.Services.AddSingleton<Func<UserType, ITrigger>>(provider => key => { switch (key) { case UserType.Admin: return provider.GetService<AdminTrigger>(); case UserType.Teacher: return provider.GetService<TeacherTrigger>(); default: return null; } });
备选方案:使用dynamic(不推荐)
如果不想修改接口和实现类,可以临时用dynamic作为委托的返回类型,但这种方式会丢失编译时类型检查,运行时可能出现错误:
builder.Services.AddSingleton<Func<UserType, dynamic>>(provider => key => { switch (key) { case UserType.Admin: return provider.GetService<AdminTrigger>(); case UserType.Teacher: return provider.GetService<TeacherTrigger>(); default: return null; } });
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

