我想创建一个方法,该方法基于给定泛型类型从数据库返回数据。如何约束一般方法的嵌套泛型类型
接口:(这个定义编译)
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; }
}
试图写入基于所述的通用方法接口:(该定义不能编译)
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);
问:
为什么会为接口编译,但不是用于该方法?
我预计工作或两者都失败。我认为编译可以从TOrderPosition给出的类型推断出TOrder和TArticle的类型,它定义了文章和订单的具体类型。
我想知道为什么会发生这种情况,以及如何以及如何解决问题,而无需明确指定所有类型。
但是你没有在你的方法中定义TOrder和TArticle泛型参数,否则它会编译。并且对于类,你指定了所有三个(TOrder,TArtile,TOrderPosition) – Evk
@Evk在回答这个问题时看起来很明显,这是不可能的,我只是希望编译器能以某种方式推断出类型' OrderPosition',因为我想避免必须列出所有类型(实际上多于3个) – Holly