我想要實現的一般方法,以從數據庫中檢索頁眉/詳細數據:如何在編譯時檢索泛型基類的參數? (即,不使用反射)
public static T RetrieveHeaderDetail<T>
where T : Header<???>, new()
// Where ??? means "what can I do here?"
{
// ...
}
這裏是通用的表示文檔標題的定義:
public class Header<TDetail> where TDetail : class, new()
{
public List<TDetail> Details;
}
這裏有一些實例:
public class RequestForQuotation : Header<RequestForQuotationDetail> { ... }
public class Order : Header<OrderDetail> { ... }
public class Invoice : Header<InvoiceDetail> { ... }
// ..
不難證明,因爲.NET不允許多重繼承或「通用專業化」(這將允許從其他Header<V>
派生),對於任何特定的T
,最多隻有一個U
T
(直接或間接)從Header<U>
繼承。而且,找到U
這個類型是微不足道的:遍歷T
的基類型,直到找到Header<U>
的實例,然後取出通用的參數!不過,C#希望我指定更改我的方法的定義如下:
public static T RetrieveHeaderDetail<T,U>
where T : Header<U>, new()
where U : class, new()
{
// ...
}
有什麼辦法可以解決這個問題嗎?我知道使用Reflection可能會有可能,但我認爲在運行時不要在編譯時做什麼是一個好習慣。
當我打這樣的問題,我真的,真的小姐 C++。
太可惜了!像這樣荒謬的限制使C#感覺像是一種玩具語言。 – pyon 2011-06-14 22:20:27