如何解决如何在编译时检索通用基类的参数? 即,不使用反射
| 我想实现一个通用方法来从数据库检索标头/明细数据: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字段的类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。