gpt4 book ai didi

c# - 无法将 ICollection 转换为 IEnumerable

转载 作者:行者123 更新时间:2023-11-30 17:28:45 24 4
gpt4 key购买 nike

我正在构建表达式树:

{x => x.principal_info.First().agent_for_property_info}

它按预期工作。

其实我需要把它转换成IEnumerable而不是 ICollection如您所见。

这是有效的方法:

public Expression<Func<T, IEnumerable<K>>> GetGenericExpression<T, K>(bool first = false, params string[] properties)
{
var expression = GetNavigationPropertySelector<T, K>(typeof(T), first, properties);

var expRight = (Expression<Func<T, IEnumerable<K>>>)expression;

return expRight;
}

在表达式中,我得到了有效的 lambda 表达式:

{x => x.principal_info.First().agent_for_property_info}

当我类型转换时:

var expRight = (Expression<Func<T, IEnumerable<K>>>)expression;

我得到一个异常(exception):

Unable to cast object of 
type
'System.Linq.Expressions.Expression`1[System.Func`2[SomeModel1,
System.Collections.Generic.ICollection`1[SomeModel]]]'
to type
'System.Linq.Expressions.Expression`1[System.Func`2[SomeModel1
,System.Collections.Generic.IEnumerable`1[SomeModel]]]'.

我知道ICollection继承自 IEnumerable假设它很容易修复。

我研究了很多但没有找到解决方案如何投 ICollection<T>IEnumerable<T>或者这是否可能?

事实上,编译器可以隐式转换它,因为这些行是有效的:

var queryData1 = new QueryData<contact_info, IEnumerable<property_info>>()
{
WhereClause = expression,
SelectClause = info => info.principal_info.First().agent_for_property_info
};

因为这个表达式是 ICollection 的类型:

info => info.principal_info.First().agent_for_property_info

最佳答案

经过几个小时的研究,尝试不同的方法,我想出了 Idea,试图克服这个异常。所以我使用的解决方法是评论中的建议:

x => x.principal_info.First().agent_for_property_info.Select(x4 => x4)

这是我在构建表达式时添加的内容:

var result1 = Expression.Call(
typeof(Enumerable), "Select", new Type[] { elementResultType, elementResultType },
resultProperty, resultExpr);

我实际上没有找到解决方案,但如果有人会遇到这样的问题,也许这个答案可以节省他的时间。

关于c# - 无法将 ICollection<t> 转换为 IEnumerable<t>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52147365/

24 4 0