首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在编译时检索泛型基类的参数?(即不使用反射)

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

Stack Overflow用户
提问于 2011-06-14 17:51:32
回答 2查看 144关注 0票数 4

我想实现一个从数据库中检索头/详细数据的通用方法:

代码语言:javascript
复制
public static T RetrieveHeaderDetail<T>
    where T : Header<???>, new()
    // Where ??? means "what can I do here?"
{
    // ...
}

下面是表示文档标题的泛型的定义:

代码语言:javascript
复制
public class Header<TDetail> where TDetail : class, new()
{
    public List<TDetail> Details;
}

下面是一些实例化:

代码语言:javascript
复制
public class RequestForQuotation : Header<RequestForQuotationDetail> { ... }
public class Order               : Header<OrderDetail>               { ... }
public class Invoice             : Header<InvoiceDetail>             { ... }
// ..

不难证明,由于.NET既不允许多重继承,也不允许“泛型专门化”(这将允许Header<U>从其他Header<V>派生),对于任何特定的T,最多只有一个U,使得THeader<U>继承(直接或间接)。此外,查找U类型很简单:在T的基本类型上迭代,直到找到Header<U>的实例,然后只使用泛型的参数!不过,C#希望我将方法的定义更改为以下内容:

代码语言:javascript
复制
public static T RetrieveHeaderDetail<T,U>
    where T : Header<U>, new()
    where U : class,     new()
{
    // ...
}

有办法解决这个问题吗?我知道使用反射是可能的,但我认为最好不要在运行时做那些在编译时可以做的事情。

当我遇到这样的问题时,我真的非常非常想念C++。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-14 19:03:55

票数 1
EN

Stack Overflow用户

发布于 2011-06-14 17:57:16

我不确定我是否完全理解您所追求的目标,但是您能定义一个接口并使用它来指定约束吗?

例如,我们在几个地方都有这样的东西:

代码语言:javascript
复制
public class Reader<T> where T : IInt32Id
{
   public T GetById(int Id)
   {
      // get by id
   }
}

然后,我只使用IInt32Id作为接口来派生所有具有int (而不是long) ID字段的类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6347802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档