无法强制转换反射,调用方法类型 IEnumerable<Tuple>

Unable to cast reflection called method type IEnumerable<Tuple>

提问人:Mulaga 提问时间:8/3/2022 最后编辑:Mulaga 更新时间:8/4/2022 访问量:75

问:

当我在反射中调用方法时,我遇到了一个错误,我无法将结果转换为其基本类型,这似乎很奇怪。(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
}



感谢您的宝贵时间

C# .NET 反射 转换

评论

1赞 Guru Stron 8/3/2022
C# 不支持类的方差
0赞 Mulaga 8/3/2022
哦好的:/所以我只能使用类型,对吧?dynamic
1赞 Guru Stron 8/3/2022
不,实际上您不是,但您需要手动重新映射元组元素。至少这是我能想到的唯一方法(至少没有更多的反思)

答:

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
好的,我将更新此反向错误的问题,如果您不提供其他建议,而不是扩展函数参数,我将关闭主题!再次感谢。