加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:20:01 所属栏目:百科 来源:网络整理
导读:我想实现一个通用方法来从数据库中检索标头/详细信息数据: public static T RetrieveHeaderDetailT where T : Header???,new() // Where ??? means "what can I do here?"{ // ...} 以下是表示文档标题的泛型的定义: public class HeaderTDetail where TDe
我想实现一个通用方法来从数据库中检索标头/详细信息数据:

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()
{
    // ...
}

有没有办法解决这个问题?我知道使用Reflection是可能的,但我认为在运行时永远不能在编译时做什么是一个好习惯.

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

解决方法

不久前我问了这个问题.

Generics with Generic Parameters and Abstract class

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读