2011-06-14 29 views
4

我想要實現的一般方法,以從數據庫中檢索頁眉/詳細數據:如何在編譯時檢索泛型基類的參數? (即,不使用反射)

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,最多隻有一個UT(直接或間接)從Header<U>繼承。而且,找到U這個類型是微不足道的:遍歷T的基類型,直到找到Header<U>的實例,然後取出通用的參數!不過,C#希望我指定更改我的方法的定義如下:

public static T RetrieveHeaderDetail<T,U> 
    where T : Header<U>, new() 
    where U : class,  new() 
{ 
    // ... 
} 

有什麼辦法可以解決這個問題嗎?我知道使用Reflection可能會有可能,但我認爲在運行時不要在編譯時做什麼是一個好習慣。


當我打這樣的問題,我真的,真的小姐 C++。

回答

0

我不知道我完全理解你在做什麼,但是你能定義一個接口並使用它來指定約束嗎?

例如,我們在幾個地方是這樣的:

public class Reader<T> where T : IInt32Id 
{ 
    public T GetById(int Id) 
    { 
     // get by id 
    } 
} 

然後我用IInt32Id作爲一個接口來獲得所有我的班有一個int(而不是長)的ID字段。

+0

該函數的身體依賴於知道「U」的身份。我應該明確表示。抱歉。 – pyon 2011-06-14 18:23:51

相關問題