gpt4 book ai didi

c# - 与 C# 中的泛型类型有些混淆

转载 作者:太空狗 更新时间:2023-10-29 21:21:01 24 4
gpt4 key购买 nike

我正在尝试使用 cqs 并尝试在类库中实现它(因此没有 IOC、IServiceProvider 等)。这是我写的一些代码:

public interface IQuery<TResult>
{
}

public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
TResult Handle(TQuery query);
}

public class Query : IQuery<bool>
{
public int Value { get; set; }
}

public class QueryHandler : IQueryHandler<Query, bool>
{
public bool Handle(Query query)
{
return query.Value > 0;
}
}

public class Dispatcher
{
private readonly Dictionary<Type, object> handlers = new Dictionary<Type, object>();

public Dispatcher()
{
handlers.Add(typeof(Query), new QueryHandler());
}

public T Dispatch<T>(IQuery<T> query)
{
IQueryHandler<IQuery<T>, T> queryHandler;

if (!this.handlers.TryGetValue(query.GetType(), out object handler) ||
((queryHandler = handler as IQueryHandler<IQuery<T>, T>) == null))
{
throw new Exception();
}

return queryHandler.Handle(query);
}
}

这就是我调用代码的方式:

Query query = new Query();
Dispatcher dispatcher = new Dispatcher();
var result = dispatcher.Dispatch(query);

但问题是在调度程序内部,我不知道为什么不能将变量处理程序转换为IQueryHandler<IQuery<T>,T>。 .这是一些额外的数据: enter image description here

PS:我知道如何使它工作(动态),但我想了解为什么这段代码不起作用。

最佳答案

这是一个协方差问题。 handler的真实类型是QueryHandler , 所以它是一个 IQueryHandler<Query, bool> .当然Query是一个 IQuery<bool> ,但这就是协方差的意义所在。

这就像试图分配一个 List<String>List<Object> 类型的变量.

存在一个out允许您在 IQueryHandler 上使用协方差的关键字如您所愿的界面。

参见 out获取详细信息

编辑:

正如 Sweeper 指出的那样, 你不能使用 outTQuery因为它被用作输入参数。正确的解决方案是避免依赖 QueryHandlerQuery . Isma很好地展示了它是如何完成的。

关于c# - 与 C# 中的泛型类型有些混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57918641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com