c# - 将存储为 List<object> 的子对象转换为父对象

标签 c# asp.net

我有一个父类和一堆子类(Child1、Child2、Child3),它们都继承自父类。

我将来自子类的不同对象存储在一个对象列表(List)中,我需要检查这些子对象中从父类继承的一些属性,我试图将子对象转换为父类,但我得到无效转换异常.

Child1 aChild1 = new Child1();
Child2 aChild2 = new child2();

List<object> childsList = new List<object>();

childsList.Add(aChild1);
childsList.Add(aChild2);

foreach(object child in childsList)
{
    Parent p = (Parent)child;//Here I got the exception
}

我可以使用“is”检查子对象的类型。

if (child is Child1){}
else if (child is Child2{} .....

或者通过获取 child 的类型并将其与类名进行比较来了解类型:

if (child.GetType().Name.Equals("Child1")
     //Do whatever
else if (child.GetType().Name.Equals("Child2")
     //Do another whatever :D

但我正在寻找一种更好的方法来将子类转换为它们的父类。

最佳答案

考虑到您的评论“问题是我使用相同的列表来存储不是 Parent 的子项的对象。”,此列表包含 Parent 的混合对象和其他不相关对象。

然后您必须以优雅的方式过滤掉它们。最简单的可能是使用 LINQ 的 OfType 方法:

List<Parent> result = childsList.OfType<Parent>().ToList();

任何不是 Parent 的对象将被忽略。

也就是说,这(通常)是一种明显的代码味道,更理想的情况是您不混合列表中存储的对象,因此 childsList可以强类型化为 List<Parent>首先,但如果不了解您的应用程序设计的其余部分,就很难对“更好的方法”的细节发表评论。

编辑:这是它与您现有代码的用法:

foreach(Parent p in childsList.OfType<Parent>())
{

}

关于c# - 将存储为 List<object> 的子对象转换为父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22348511/

相关文章:

c# - 如何使用 ASP.NET 访问 FaceBook Ads API

c# - 如何将流上传到Azure媒体服务

c# - 排序字典时出错

c# - Membership(+ roles) VS session state VS 表单认证

c# - ASP.NET MVC 4 路由匹配,但 Controller 从未被调用

javascript - 在循环中注册启动脚本

c# - 用正则表达式分割

c# - 将字符串属性限制为一组预定义的值(枚举中没有连字符的解决方法)

c# - 需要 wpf lostfocus 事件的正则表达式

c# - 如何在 c# asp html 中制作具有 tiles 样式的树?