如何在编译时检索通用基类的参数? (即,不使用反射)
|
我想实现一个通用方法来从数据库检索标头/明细数据:
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 ++。
没有找到相关结果
已邀请:
2 个回复
财沟项胶
郸身
然后,我仅使用IInt32Id作为接口来派生所有具有int(而不是long)ID字段的类。