在 C# 中转换 List 对象

发布于 2024-11-07 17:45:23 字数 247 浏览 0 评论 0原文

我需要将一个 List 对象转换为另一个 List 对象,该对象是一个接口

public class THold : IHold
{..}

,这里,IHold 是接口。

我想这样做:

List<THold> hold = new List<THold>();
List<IHold> test = hold;

I need to cast a List object to another List object which is an interface

public class THold : IHold
{..}

Here, IHold is the interface.

I want to do this:

List<THold> hold = new List<THold>();
List<IHold> test = hold;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

风吹雪碎 2024-11-14 17:45:23

最接近的是:

List<IHold> test = hold.Cast<IHold>().ToList();

问题是不存在直接转换。如果我有以下情况怎么办:

public class THold : IHold { /* ... */ }

public class UHold : IHold { /* ... */ }

然后:

List<THold> holds = new List<THold>();
List<IHold> iholds = (List<IHold>) holds;

iholds.Add(UHold);

显然 UHold 实现了 IHold 接口,但也显然无法添加到 THold 列表中对象。

The closest you're going to come is:

List<IHold> test = hold.Cast<IHold>().ToList();

The problem is that a direct cast doesn't exist. What if I had the following:

public class THold : IHold { /* ... */ }

public class UHold : IHold { /* ... */ }

And then:

List<THold> holds = new List<THold>();
List<IHold> iholds = (List<IHold>) holds;

iholds.Add(UHold);

Obviously UHold implements the IHold interface but also obviously can't be added to the list of THold objects.

世俗缘 2024-11-14 17:45:23

那么,List<> 不能以非泛型形式创建;我猜您在撰写帖子时丢失了尖括号。

不管怎样,我猜你想从 List 转到 List,反之亦然。无论哪种方式,最好的选择是 Linq 的 OfType() 方法:

List<THold> hold = new List<THold>();
//populate hold with items
List<IHold> test = hold.OfType<IHold>().ToList();

Cast<>() 方法也应该有效,但是我发现每当我尝试使用它来执行其规定的任务时,它永远不会工作正常。将 Select() 与投射每个项目的投影一起使用也将起作用:

List<IHold> test = hold.Select(x=>(IHold)x).ToList();

Well, List<> cannot be created in non-generic form; I'm guessing you lost the angle brackets somewhere in writing your post.

Anyway, I'm guessing you want to go from a List<THold> to a List<IHold>, or vice versa. Either way, the best option is the OfType() method of Linq:

List<THold> hold = new List<THold>();
//populate hold with items
List<IHold> test = hold.OfType<IHold>().ToList();

The Cast<>() method should also work, however I find whenever I try to use it to perform its stated task it never works right. Using Select() with a projection that casts each item will also work:

List<IHold> test = hold.Select(x=>(IHold)x).ToList();
◇流星雨 2024-11-14 17:45:23

这篇 msdn 文章介绍了协变和逆变,它们是您所要表达的术语描述。

This msdn article describes co- and contravariance which are the terms of what you describe.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文