- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们有一个 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
类型的项目或 AnotherChild
到 List<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/
我想设置一个 float值到 1.0如果一个向量等于另一个向量,并且 0.0如果向量不相等 if( v1 == v2 ) floatVal = 1.0 ; else floatVal = 0.0
有没有什么办法投listView.SelectedIndices至 List ? 我试过了 (List)reListViewAllMovies.SelectedIndices.Cast>() 但它不起
假设我有一个数据框: data <- data.frame(id=c(1,2,2,2), code=c("A","B","A","B"),
我是一名优秀的程序员,十分优秀!