首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有泛型的C#子类:我需要为ctor提供一个额外的泛型参数,但是如何实现呢?

带有泛型的C#子类:我需要为ctor提供一个额外的泛型参数,但是如何实现呢?
EN

Stack Overflow用户
提问于 2020-10-04 04:16:37
回答 2查看 60关注 0票数 0

我有个课

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class LDBList<T> : List<T> where T : LDBRootClass {
    // typical constructor
    public LDBList(LDBList<T> x) : base(x) { }
    ...
}

但是我希望有一个额外的构造函数,它接受一个不同的泛型类型的列表(例如A),以及一个将A转换为T的函数,然后从它构建T列表,类似于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public LDBList(
        Func<A, T> converter, 
        IList<A> aList)
{
    foreach (var x in aList) {
        this.Append(converter(x));
    }
}

所以converterA->T类型的,所以我取一个A列表,然后从它生成一个T列表。我的类是由T参数化的,所以这很好。

但它在抱怨“找不到类型或名称空间名称'A‘”。

好的,所以它需要类上的一个A泛型参数(它真的不喜欢构造函数)。但我把它放在哪里,事实上,这甚至是可能的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-04 04:26:00

我不相信您可以在这样的构造函数中添加额外的泛型类型。

我将重构转换器以完成LDBList实例的创建并返回实例,这样转换就像工厂一样从A的实例创建LDBLists。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Converter<T,A>
{
    public LDbList<T> CreateLdbList(IList<A>) {
       var list = new LdbList<T>();
       // do the conversion here
       return list;
    }
}

然后,将用法更改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var Converter<X,Y> = new Converter();
var result = Converter.Convert(originalData);
票数 1
EN

Stack Overflow用户

发布于 2020-10-04 04:25:47

理论上,您可以将额外的类型添加到类本身的泛型类型中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class LDBList<A, T> : List<T> where T : LDBRootClass
{
    // typical constructor
    public LDBList(LDBList<A, T> x) : base(x) { }

    public LDBList(
        Func<A, T> converter,
        IList<A>   aList)
    {
        foreach (var x in aList)
        {
            this.Append(converter(x));
        }
    }
}

当然,这意味着您需要使用一个额外的类型参数来声明该类型的实例,除非您使用特定的构造函数,否则您甚至不需要这个参数。那就不好了。

您可以像这样声明一个助手类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static class LDBListCreator
{
    public static LDBList<T> CreateFrom<T, A>(Func<A, T> converter, IList<A> aList) where T: LDBRootClass
    {
        var result = new LDBList<T>();
        result.AddRange(aList.Select(converter));
        return result;
    }
}

这假设LDBList<T>有一个默认的构造函数。

但是在检查时,您应该能够看到创建这样一个简单的助手类是毫无意义的。如果将构造函数添加到接受IEnumerable<T> (像List<T>类一样)的list类中,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public LDBList(IEnumerable<T> items) : base(items)
{
}

然后,只需使用LDBList<T>就可以构造一个IEnumerable.Select()实例。

例如,考虑到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class LDBRootClass
{
}

public class DerivedLDBRootClass : LDBRootClass
{
    public DerivedLDBRootClass(string value)
    {
        // .. whatever
    }
}

然后,您可以很简单地将List<string>转换为LDBList<DerivedLDBRootClass>,而不需要任何额外的脚手架,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var strings = new List<string> { "One", "Two", "Three", "Four", "Five" };
var result  = new LDBList<DerivedLDBRootClass>(strings.Select(item => new DerivedLDBRootClass(item)));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64194477

复制
相关文章
【Kotlin】泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )
将 泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 ,
韩曙亮
2023/03/30
2.9K0
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
给.neter们整理了一份《.NET/C#面试手册》,目前大约4万字左右,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点,就当是查缺补漏!
全栈程序员站长
2022/09/14
2.6K0
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )
将 泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 ,
韩曙亮
2023/03/30
4.1K0
【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ;
韩曙亮
2023/03/29
15.6K0
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
C#里面的泛型(T),泛型类,泛型方法,泛型接口等简单解释
只是比较简单的解释,在实际使用中,如果遇到需要深入研究的场景,再翻阅相关资料深入研究下。
zls365
2020/08/19
4.2K0
C# 泛型
泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为泛型。这会大大简化我们的代码结构,同时让后期维护变得容易。
宿春磊Charles
2022/03/29
5090
C#泛型
泛型(Generic) 是C# 2.0中的新增元素。这种机制允许将类名作为参数传递给泛型类型,并生成相应的对象。将泛型(包括类、接口、方法等)看作模板可能更好理解,模板中的变体部分将被作为参数传进来的类名称所代替,从而得到一个新的类型定义。   通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率。您只须一次性地将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。为此,需要使用 <和 > 括号,以便将一般类型参数括起来。 List<string> list = new List<strin
拾点阳光
2018/05/10
1.7K0
C# 泛型
泛型方法  ShowProp    对比    普通方法  ShowProp<T>
明志德道
2023/10/21
1610
C# 泛型
1、泛型的优势 在日常开发中,我们经常会开发一些特殊的功能,而这个功能适用于多个类型(比如string,int等多种类型),最简单的做法是给每种类型都做一个实现,这种做法的缺点是代码冗余,无疑增加了我们的工作量,第二种做法是通过object进行拆装箱转换,这种做法的缺点是Object类不是类型安全的,而且损失的性能比较大,遍历多项时,尤其如此。最好的方法是使用泛型,.NET自从2.0开始支持泛型,它不仅是编程语言的一部分,而且与程序集中间语言IL紧密结合。以下是泛型的优点 (1)、通过泛型我们不必给不同的类
郑小超.
2018/01/26
6610
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
泛型类用法 : 使用时先声明泛型 , 如果不声明泛型 , 则表示该类的泛型是 Object 类型 ;
韩曙亮
2023/03/29
10.2K0
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 )
泛型作用 : 为 类 , 接口 , 方法 提供复用性 , 支持类型不确定的数据类型 ;
韩曙亮
2023/03/28
5.4K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
冷环渊
2021/11/29
3.5K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
Dart中的泛型方法、泛型类、泛型接口
为了能在一个方法里实现传入什么数据类型就返回什么数据类型,可以利用泛型将方法写成下面这样:
越陌度阡
2020/12/10
3.8K0
Dart中的泛型方法、泛型类、泛型接口
泛型(泛型擦除)【java基础—-泛型】
Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter),这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
全栈程序员站长
2022/11/02
2.7K0
泛型(泛型擦除)【java基础—-泛型】
C#动态调用泛型类、泛型方法
      主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用泛型类或泛型方法。控制台程序解决方案如下:
hbbliyong
2018/12/28
3K0
C#泛型的用处
昨天公司请了一个老师过来讲解QAD财务系统,可能是她声音太小,或者屏幕太过模糊导致底下很多人都昏昏欲睡,包括我。只有我的副理特别牛,一直在和那老师讨论问题,问得那老师几乎要招架不住了。我心里那个佩服啊…
SAP梦心
2022/05/07
1.3K0
当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢
我们都知道在java中,只要是类型兼容,就可以将一种类型的对象分配给另一种类型的对象。比如可以将一个Integer类型的对象分配给Object类型的对象,因为Object 是Integer的超类。
阿Q说代码
2022/02/16
2.9K0
当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢
泛型接口,泛型类和泛型通配符
泛型的使用位置,除了最常见的约束集合元素,还可以使用在接口,类,方法上面。最本质的原因就是为了在使用接口,类,方法的时候,可以将类型作为参数,进行类型的参数传递。这样可以使程序的编写更加的灵活,在创建对象,调用方法的时候动态的指定类型,所以泛型也可以理解为类型的参数化。
用户5745563
2019/07/04
2.4K0
泛型接口,泛型类和泛型通配符
Java 泛型擦除_泛型和泛型擦除
如果仅凭直觉来看,该程序可能会输出 false 这个结果,但在具体的环境下运行时会输出 true 。这很令人费解,这是为什么呢?
全栈程序员站长
2022/11/01
2.4K0
C#中的泛型
.Net 1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持。通过使用泛型,我们可以极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱、拆箱,在一定程度上提升了应用程序的性能。本文将系统地为大家讨论泛型,我们先从理解泛型开始。
张子阳
2018/09/30
1.2K0

相似问题

如何实现非泛型的泛型参数

13

带有泛型参数的泛型类参数

21

带有子类的泛型

30

泛型扩展方法中的额外泛型参数?

30

带有其他泛型类型参数的c#泛型方法

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文