给定IObject<T>
和IResult<T>
public interface IObjectHandler<TQ, TR> where TQ : IObject<TR>
Task<IResult<TR>> DoIt(TQ o);
我创建了一个TestObject : IObject<bool>
接口示例TestResult<T> : IResult<T>
TestObjectHandler : IObjectHandler<TestObject, bool>
调用TestObjectHandler DoIt方法时,它应返回类型为bool的TestResult对象。
IObject到IObjectHandler的实现是一对一的。IObject和处理程序类有很多种。在执行时,我们只知道IObject。我们希望用IServiceCollection注册所有实现,然后在需要时使用IServiceProvider获取正确的处理程序。
类似于(其中obj是IObject)
var handlerType = typeof(IObjectHandler<,>);
var constructedHandler = handlerType.MakeGenericType(obj.GetType(), typeof(T));
var handler = _serviceProvider.GetService(handlerType);
如果我手动强制转换为IObjectHandler〈TestObject,bool〉,那么我可以调用DoIt。
但如果我尝试强制转换为(T为bool)IObjectHandler<IObject<T>, T>
则铸造将失败。
我正在寻找一种方法,能够调用DoIt,并获得正确的铸造对象回来。
我不想使用反射,因为它们会比需要的慢。我可以创建一个非泛型接口来调用它,但要么我必须有一个基类来实现非泛型并为我转换对象,要么在应该只有一个的地方留下两个方法。
这个项目可以由各种不同的人使用,所以坚持他们必须使用基类而不是仅仅离开接口或使用两个更丑陋的方法是不理想的。
我觉得基类是最好的方法。希望有人能有更好的主意
1条答案
按热度按时间qfe3c7zg1#
@neil给了我一个指向答案的指针,这是我试图实现的一个Mediator模式。
我需要的是一个中间层。接受IObject类型和返回类型,使用Activator.CreateInstance创建一个具有所有所需泛型参数的泛型类的示例。然后可以使用IServiceProvider获得具有类型化参数的正确处理程序。
参见https://github.com/jbogard/MediatR/blob/master/src/MediatR/Wrappers/RequestHandlerWrapper.cs