我想創建一個方法,該方法基於給定泛型類型從數據庫返回數據。如何約束一般方法的嵌套泛型類型
接口:(這個定義編譯)
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