提问人:Mulaga 提问时间:8/3/2022 最后编辑:Mulaga 更新时间:8/4/2022 访问量:75
无法强制转换反射,调用方法类型 IEnumerable<Tuple>
Unable to cast reflection called method type IEnumerable<Tuple>
问:
当我在反射中调用方法时,我遇到了一个错误,我无法将结果转换为其基本类型,这似乎很奇怪。(IEnumerable<Tuple<SortingOrder, Expression>>)
当我在表达式中强制转换另一个方法时,我没有这个问题。我想问题出在IEnumerable或元组上。有谁知道如何做到这一点?
调用以下第一个方法时出错:
public static IEnumerable<Tuple<SortingOrder, Expression>> ConvertOrderByToTupleExpression(Type entityType, string orderBy)
{
return (IEnumerable<Tuple<SortingOrder, Expression>>)typeof(RepositoryReflectionHelper)
.GetMethods()
.First(x => x.Name == nameof(RepositoryReflectionHelper.ConvertOrderByToTupleExpression) && x.IsGenericMethod && x.GetParameters().Count() == 1)
.MakeGenericMethod(new Type[] { entityType })
.Invoke(null, new object[] { orderBy });
}
public static IEnumerable<Tuple<SortingOrder, Expression<Func<TEntity, object>>>> ConvertOrderByToTupleExpression<TEntity>(string orderBy)
{
List<Tuple<SortingOrder, Expression<Func<TEntity, object>>>> orderByCriteriaTuple = new List<Tuple<SortingOrder, Expression<Func<TEntity, object>>>>();
return orderByCriteriaTuple;
}
更新:
以下代码中“反向”操作的相同错误:
IEnumerable<Tuple<SortingOrder, Expression>> orderByExpression = RepositoryReflectionHelper.ConvertOrderByToTupleExpression(entityType, orderBy);
var calledFunction = GetManyPaging(orderByExpression);
public IEnumerable<TEntity> GetManyPaging(IEnumerable<System.Tuple<SortingOrder, Expression<Func<TEntity, object>>>> orderByCriteriaTuple)
{
// Do something not significant
}
感谢您的宝贵时间
答:
1赞
Guru Stron
8/3/2022
#1
C# 不支持类的方差,但您可以利用它支持接口方差、协变接口并实现 ITuple
这一事实:IEnumerable<T>
Tuple<T1, T2>
object tuple = new[]
{
new Tuple<int, Expression<Func<int>>>(1, () => 1)
};
IEnumerable<Tuple<int, Expression>> enumerable = ((IEnumerable<ITuple>)tuple)
.Select(t => Tuple.Create((int)t[0], (Expression) t[1]))
.ToList(); // to list to make sure it does work
评论
0赞
Mulaga
8/3/2022
是的,我不会错过的,我只剩下一分了。当我尝试将 Tuple<Expression> 传递给需要作为参数的函数时,我遇到了同样的错误:/我是否必须扩展函数参数中的类型?Tuple<Expression<Func<TEntity, object>>>
0赞
Guru Stron
8/3/2022
@Mulaga,您需要扩展函数参数或再次“重新组合”元组。TBH 没有更全面地了解您尝试做什么、如何以及为什么这样做,很难给出任何具体的建议,如何把事情做得更好。
0赞
Mulaga
8/3/2022
好的,我将更新此反向错误的问题,如果您不提供其他建议,而不是扩展函数参数,我将关闭主题!再次感谢。
评论
dynamic