gpt4 book ai didi

c# - 如果将类型为 IEnumerable 的对象作为对象传递给函数,如何将其转换为 IEnumerable

转载 作者:行者123 更新时间:2023-11-30 19:14:05 24 4
gpt4 key购买 nike

我正在尝试将作为对象传递的参数(它是 IEnumerable 类型对象的向上转换)向上转换为 IEnumerable,其中 Foo 实现了 IFoo。

这是我想做但行不通的示例。

public void F(object o)
{
//I know the object o is of type IEnumerable<Foo> where Foo implements IFoo
IEnumerable<IFoo> ifoos = (IEnumerable<IFoo>) o);
}

有解决办法吗?我不想使函数 F Foo 特定,但我无法将其转换为接口(interface),除非我这样做:

IEnumerable<IFoo> ifoos = (IEnumerable<Foo>) o).Select( f => (IFoo) f);

谢谢

朱塞佩

最佳答案

在 .NET 4.0 之前,您不能 - IEnumerable<T>在 .NET 4.0 之前是不变的

使用 .NET 4.0,您发布的代码可以正常工作。

在 .NET 3.5 中,您可以使用 Enumerable.Cast :

public void F(object o)
{
IEnumerable<IFoo> ifoos = ((IEnumerable) o).Cast<IFoo>();
}

基本上这使用弱类型 IEnumerable (IEnumerable<Foo>IEnumerable<IFoo> 都扩展了,所以转换没问题)然后应用 Cast<T>方法,它基本上会链接另一个迭代器以对每个项目执行转换。如果Foo : IFoo,该类型转换肯定会起作用,所以你会没事的。

在 .NET 2.0 中,您基本上必须编写 Cast你自己,这很容易 - 特别是如果你不需要做任何捷径:

public static IEnumerable<TResult> Cast<TSource, TResult>
(IEnumerable<TSource> source)
{
foreach(TSource item in source)
{
yield return (TResult) (object) item;
}
}

双重 Actor 有点尴尬,但它有效......

关于c# - 如果将类型为 IEnumerable<Foo> 的对象作为对象传递给函数,如何将其转换为 IEnumerable<IFoo>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1530969/

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