gpt4 book ai didi

C#,实例化泛型类型 - 具有可变类型参数?

转载 作者:太空宇宙 更新时间:2023-11-03 18:33:44 25 4
gpt4 key购买 nike

代码示例:

void Foo(params object[] objects)
{
var entries = new List<IEntry>();
foreach(var o in objects)
{
var entry = new Entry<o.GetType()>(); // this doesn't work
entries.Add(entry);
}

...
}

Foo("hello", 5); // should fill entries with Entry<string> and Entry<int>

为什么这不可能?我想我需要用反射代替?如何正确且高效地做到这一点?

最佳答案

您不能像您在代码段中尝试的那样使用 C# 泛型。

为了使用 [C#] 泛型,实际对象类型必须在编译时已知

您正在尝试将对象类型作为类型参数动态传递。这是不可能的。

编辑

是的,可以使用反射动态创建通用对象。毕竟,泛型是作为编译时 C# 构造和 .NET 框架功能实现的(相对于 Java,它只是基于类型删除的编译时功能)。因此,在 .NET 中,通过反射,可以实现后者“绕过”前者(同样,这在 Java 中是不可能的)。

但 OP 显然不需要。

毕竟,entriesList<IEntry> . IOW,entries容器不“知道”其元素的具体类型(因为它绑定(bind)到一个接口(interface))。因此,如果要添加的每个元素都已经实现了 IEntry ,那么这就足够了:

void Foo(params IEntry[] objects)
{
var entries = new List<IEntry>();
foreach(var o in objects)
{
entries.Add(o);
}

...
}

OTOH,如果这些对象没有实现 IEntry ,那么 OP 只需要一个纯粹的、普通的、老式的无类型对象列表:

void Foo(params object[] objects)
{
var entries = new List<object>();
foreach(var o in objects)
{
entries.Add(o);
}

...
}

因此,即使可能,使用反射来动态创建通用容器对于这个特定的用例来说似乎也有点过分了。

关于C#,实例化泛型类型 - 具有可变类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18625731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com