gpt4 book ai didi

c# - 将父类投给子类

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

我们有一个 ObservableCollection<T>共 6 ObservableCollection List<Parent>它们都有不同类型的子类。

我们想要做的是使用通用方法来检索所有具有相同类型的对象,换句话说,检索一个包含所有 <T> 的列表。 children 。

这是我的源代码

类 A 和 B 是父类的子类。

ObservableCollection<ManagerTemplate> ManagerListStack = new ObservableCollection<ManagerTemplate>(ManagerTemplates);


class ManagerTemplate
{
public Type _Type { get; set; }
public ObservableCollection<Parents> parentList {get;set;}
}

internal static List<ManagerTemplate> ManagerTemplates = new List<ManagerTemplate>()
{
new ManagerTemplate{ List= new ObservableCollection<Parent>(),Type=typeof(A)},
new ManagerTemplate{ List= new ObservableCollection<Parent>(),Type=typeof(B)}
};

public static List<T> Get<T>() where T : Parent
{
/*(ManagerListStack.Where(x => x._Type == typeof(T)).First().List.Cast<T>()).ToList(); -- TRY 1*/
/*(List<T>)(ManagerListStack.Where(x => x._Type == typeof(T)).First().List.Cast<T>())* -- TRY 2*/
return (ManagerListStack.Where(x => x._Type == typeof(T)).First().List.Cast<T>()).ToList();
}

使用

(ManagerListStack.Where(x => x._Type == typeof(T)).First().List  as List<T>)

返回的列表中没有元素,我100%确定并调试了列表,里面有元素。

使用

(List<T>)(ManagerListStack.Where(x => x._Type == typeof(T)).First().List.Cast<T>())

我收到错误“无法从父级转换为 A 或 B”

最佳答案

SomeListOfX as List<Y>永远不会工作。事实Y源自 X并不意味着 List<Y>源自 List<X> !这两种列表类型不兼容;它们只是两种不同的类型。

A List<Parent>不能转换为 List<Child> , 即使它只包含 Child 类型的项目因为 C# 在编译时只知道静态类型,不知道运行时类型。该列表可能包含非 Child 类型的项目.

顺便说一下,反之亦然。因为如果你能施展 List<Child>List<Parent> , 那么您可以添加 Parent 类型的项目或 AnotherChildList<Parent> , 但由于基础列表仍然是 List<Child> 类型这会搞砸的!请注意,转换对象不会创建新对象(即它不会转换对象),它只是告诉 C# 将其视为另一种类型。例如。你可以说 Child child = (Child)parent;如果你知道 parent引用一个 child 。


(List<T>)(ManagerListStack.Where(x => x._Type == typeof(T)).First().List.Cast<T>())

Cast<T>产生 IEnumerable<T>而且你不能投 IEnumerable<T>List<T> !可枚举不是列表。


有效的是

List<Y> listOfY = listOfX.Cast<Y>().ToList();

如果X可以转换为 Y .


您在 Get<T> 中的第三个(未注释的)示例作品:

return ManagerListStack
.Where(x => x._Type == typeof(T))
.First().List
.Cast<T>()
.ToList();

关于c# - 将父类投给子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22897809/

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