如何在不知道项目泛型类型参数的情况下对作为泛型给出的列表进行浅表复制? [复制]

Posted

技术标签:

【中文标题】如何在不知道项目泛型类型参数的情况下对作为泛型给出的列表进行浅表复制? [复制]【英文标题】:How to shallow copy of a list given as generic without knowing the items generic type parameter? [duplicate] 【发布时间】:2021-07-31 10:18:48 【问题描述】:

我做到了:

T clone(T source)

    if(source != null && source.GetType() == typeof(List<>))
    
        Type listType = source.GetType();
        Type listElemType = listType.GetGenericArguments()[0].GetType();
        var listClone = (T)Activator.CreateInstance(listType.MakeGenericType(listElemType));
        ...
        return listClone;
    
    ...

现在,如何填充克隆?正如我所说,我只需要一个浅拷贝。谢谢。

【问题讨论】:

如果T 已经是List&lt;X&gt;,则不需要重新构建该类型。但是这个方法是怎么调用的呢?这是一种糟糕的代码气味。如果你使用泛型,你应该指定约束,这样你就不需要使用反射了。 如果列表中的类型是引用类型,你想要相同的引用还是新的引用?克隆值类型充其量只是学术性的,克隆引用类型可能非常困难。 @Erik Philips OP 要求shallow copy。 @OlivierRogier 你知道浅拷贝的技术定义,我不确定 OP 是。我可能应该问他是否知道这个技术术语,否则只需一个简单的ToList() @ErikPhilips 我认为 OP 不能将副本用于所提出的问题。 OP让我发现了技术表达,因此OP应该意识到,特别是因为OP坚持这个术语。 【参考方案1】:

我不确定你为什么需要这个功能。大概T 是某种List&lt;U&gt;,你在编译时就知道了。在这种情况下,您只需要var listClone = myList.toList()

【讨论】:

以上是关于如何在不知道项目泛型类型参数的情况下对作为泛型给出的列表进行浅表复制? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c# 在不知道类型的情况下,如何判断并使用带泛型的扩展方法?

泛型类的可选方法参数的类型

C#如何将类型Type作为泛型T的参数T传递

如何在泛型集合上创建扩展方法

Java泛型类

Java 泛型