我想实现一个从数据库中检索头/详细数据的通用方法:
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>从其他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()
{
// ...
}有办法解决这个问题吗?我知道使用反射是可能的,但我认为最好不要在运行时做那些在编译时可以做的事情。
当我遇到这样的问题时,我真的非常非常想念C++。
发布于 2011-06-14 19:03:55
发布于 2011-06-14 17:57:16
我不确定我是否完全理解您所追求的目标,但是您能定义一个接口并使用它来指定约束吗?
例如,我们在几个地方都有这样的东西:
public class Reader<T> where T : IInt32Id
{
public T GetById(int Id)
{
// get by id
}
}然后,我只使用IInt32Id作为接口来派生所有具有int (而不是long) ID字段的类。
https://stackoverflow.com/questions/6347802
复制相似问题