泛型IObjectHandler接口类型转换与调用方案咨询
解决方案
方案1:非泛型标记接口+动态调用(推荐)
该方案对现有代码侵入极小,第三方实现者无需修改任何代码:
- 添加非泛型标记接口
新增一个空接口作为标记,不需要任何方法:
public interface IObjectHandler { }
- 修改泛型处理器接口继承标记
让原泛型接口继承这个非泛型接口,仅需修改接口定义,现有处理器会自动实现该标记:
public interface IObjectHandler<TQ, TR> : IObjectHandler where TQ : IObject<TR> { Task<IResult<TR>> DoIt(TQ o); }
- 封装调用器类
把类型转换和调用逻辑封装起来,业务代码直接调用即可:
public static class ObjectHandlerInvoker { public static async Task<IResult<TR>> Invoke<TR>(IObject<TR> obj, IServiceProvider serviceProvider) { var objType = obj.GetType(); var handlerType = typeof(IObjectHandler<,>).MakeGenericType(objType, typeof(TR)); var handler = serviceProvider.GetService(handlerType) as IObjectHandler; if (handler == null) throw new InvalidOperationException($"未找到{objType.Name}对应的处理器"); // 用dynamic绕过编译期类型检查,运行时自动匹配正确的DoIt方法 return await ((dynamic)handler).DoIt((dynamic)obj); } }
- 业务侧调用示例
// obj是IObject<bool>实例(比如TestObject) var result = await ObjectHandlerInvoker.Invoke<bool>(obj, _serviceProvider); // result是强类型IResult<bool>,可直接使用
方案2:适配器模式(适合无法修改原接口的场景)
如果不能修改原IObjectHandler<TQ, TR>接口,可以为每个处理器创建适配器,统一转换为可调用的非泛型接口:
- 定义非泛型可调用接口
public interface IObjectHandlerNonGeneric<TR> { Task<IResult<TR>> DoIt(IObject<TR> o); }
- 创建泛型适配器
public class ObjectHandlerAdapter<TQ, TR> : IObjectHandlerNonGeneric<TR> where TQ : IObject<TR> { private readonly IObjectHandler<TQ, TR> _handler; public ObjectHandlerAdapter(IObjectHandler<TQ, TR> handler) { _handler = handler; } public Task<IResult<TR>> DoIt(IObject<TR> o) { return _handler.DoIt((TQ)o); } }
- 注册时绑定适配器
注册处理器时同时注册对应的适配器:
services.AddScoped<IObjectHandler<TestObject, bool>, TestObjectHandler>(); services.AddScoped<IObjectHandlerNonGeneric<bool>>(sp => new ObjectHandlerAdapter<TestObject, bool>(sp.GetRequiredService<IObjectHandler<TestObject, bool>>()));
- 调用示例
var handler = _serviceProvider.GetRequiredService<IObjectHandlerNonGeneric<bool>>(); var result = await handler.DoIt(obj);
方案对比
- 方案1侵入性极低,仅需修改接口定义,调用逻辑简洁,推荐优先使用
- 方案2无需修改原接口,但需要额外注册适配器,适合无法修改原接口的场景
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

