gpt4 book ai didi

c# - 如何约束泛型方法的嵌套泛型类型

转载 作者:行者123 更新时间:2023-12-04 00:36:44 50 4
gpt4 key购买 nike

我正在尝试创建一种方法,该方法根据给定的泛型类型从数据库返回数据。

接口(interface):(本定义编译)

public interface IOrderPosition<TOrder, TArticle, TOrderPosition>
where TOrder : IOrder
where TArtile : IArticle
where TOrderPosition : IOrderPosition<TOrder, TArticle, TOrderPosition>
{
long? id { get; set; }
TOrder order { get; set; }
TArtile article { get; set; }
List<TOrderPosition> subPositions { get; set; }
}

一个可能的具体实现:(这个定义编译)

public class OrderPosition : IOrderPosition<Order, Article, OrderPosition>
{
public long? id { get; set; }
public Order order { get; set; }
public Article article { get; set; }
public List<OrderPosition> subPositions { get; set; }
}

尝试基于接口(interface)编写通用方法:(此定义无法编译)

public List<TOrderPosition> GetOrderPositionOfOrder<TOrderPosition>(long? id) 
where TOrder : IOrder
where TArticle : IArticle
where TOrderPosition : IOrderPosition<TOrder, TArticle, TOrderPosition>
{
..
}

错误:

'DataSourceOrder.GetOrderPositionOfOrder<TOrderPosition>()' does not define type parameter 'TOrder'
'DataSourceOrder.GetOrderPositionOfOrder<TOrderPosition>()' does not define type parameter 'TArticle'
The type or namespace name 'TOrder' could not be found (are you missing a using directive or an assembly reference?)
The type or namespace name 'TArticle' could not be found (are you missing a using directive or an assembly reference?)

像这样使用:

List<OrderPosition> positions = GetOrderPositionOfOrder<OrderPosition>(5);
List<TransferOrderPosition> transferPositions = GetOrderPositionOfOrder<TransferOrderPosition>(5);

问题:

为什么这个编译是针对接口(interface),而不是针对方法?

我希望两者都能工作或都失败。我假设编译可以从为 TOrderPosition 指定的类型推断出 TOrder 和 TArticle 的类型,TOrderPosition 定义了文章和订单的具体类型。

我想知道为什么会发生这种情况,以及我是否可以以及如何在不必明确指定所有类型的情况下解决该问题。

最佳答案

Why does this compile for the interface, but not for the method?

好吧,你正在声明 TOrderTArticleIOrderPosition接口(interface)但不在GetOrderPositionOfOrder方法。

您需要在方法声明中声明这些泛型参数:

public List<TOrderPosition> GetOrderPositionOfOrder<TOrder, TArticle, TOrderPosition>(long? id)
where TOrder : IOrder
where TArticle : IArticle
where TOrderPosition : IOrderPosition<TOrder, TArticle, TOrderPosition>
{
...
}

然后这样调用它:

var list = GetOrderPositionOfOrder<Order, Article, OrderPosition>(5);

但是如果你想调用GetOrderPositionOfOrder喜欢:

var list = GetOrderPositionOfOrder<OrderPosition>(5);

你可以制作IOrderPosition TOrder 中的协变和 TArticle :

interface IOrderPosition<out TOrder, out TArticle, TOrderPosition>
where TOrder : IOrder
where TArticle : IArticle
where TOrderPosition : IOrderPosition<TOrder, TArticle, TOrderPosition>
{
long? id { get; set; }
TOrder order { get; }
TArticle Article { get; }
List<TOrderPosition> subPositions { get; set; }
}

请注意 OrderArticle必须是 getter-only 属性(但 OrderPosition 中的这些属性可以有 set 访问器)。

方法:

public List<TOrderPosition> GetOrderPositionOfOrder<TOrderPosition>(long? id)
where TOrderPosition : IOrderPosition<IOrder, IArticle, TOrderPosition>
{
...
}

这样做你可以调用像GetOrderPositionOfOrder<OrderPosition>(5)这样的电话.

关于c# - 如何约束泛型方法的嵌套泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40790040/

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