如何在编译时检索通用基类的参数? (即,不使用反射)

| 我想实现一个通用方法来从数据库检索标头/明细数据:
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<U>
从其他other4派生),因此对于任何特定的
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 ++。     
已邀请:
        我不久前问了这个问题。 具有泛型参数和抽象类的泛型     
        我不确定我是否完全了解您的需求,但是您可以定义一个接口并使用它来指定约束吗? 例如,我们在几个地方有这样的东西:
public class Reader<T> where T : IInt32Id
{
   public T GetById(int Id)
   {
      // get by id
   }
}
然后,我仅使用IInt32Id作为接口来派生所有具有int(而不是long)ID字段的类。     

要回复问题请先登录注册