gpt4 book ai didi

c# - 通用和非通用集合之间的 linq `from` 子句?

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

我有这些 linq from句子中的从句:

IEnumerable<T> collection = //...;
IEnumerable<PropertyInfo> propertiesToFlat = typeof(T).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(FlattenAttribute)));

var accessorFieldsbyLevel = from element in collection
from property in propertiesToFlat
from internalField in (IEnumerable<object>)(typeof(T).GetProperty(property.Name).GetValue(element))
//...

这句话编译。但是我需要替换下一个 from子句:

from internalField in (IEnumerable<object>)(typeof(T).GetProperty(property.Name).GetValue(element))

由这个:

from internalField in (IEnumerable)(typeof(T).GetProperty(property.Name).GetValue(element))

所以,我只更改 (IEnumerable<object>)由另一个类型转换(IEnumerable) .

然后编译器告诉我:

Error 1 An expression of type 'System.Collections.IEnumerable' is not allowed in a subsequent from clause in a query expression with source type 'System.Collections.Generic.IEnumerable'. Type inference failed in the call to 'SelectMany'.

我完全不知道发生了什么。这里有什么问题吗?

[编辑]

我想问题是因为 collectionpropertiesToFlat是通用集合,我正在尝试设置 from带有非泛型的子句 IEnumerable .

我该如何解决?

最佳答案

基本上,LINQ 包含非常少数可用于非泛型集合的操作。没有 Enumerable.Where(IEnumerable, ...)例如 - 只有 Enumerable.Where<T>(IEnumerable<T>, ...) .

解决此问题的最简单方法是在您的查询中使用明确类型化的范围变量,这将插入对Enumerable.Cast<T>(IEnumerable) 的调用。 :

from object internalField in (IEnumerable)(typeof(T).GetProperty(property.Name).GetValue(element))

相当于:

from internalField in 
((IEnumerable)(typeof(T).GetProperty(property.Name).GetValue(element))
.Cast<object>()

关于c# - 通用和非通用集合之间的 linq `from` 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33827075/

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