gpt4 book ai didi

c# - 如何从实际类型推断 TResult?

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

我正在使用 Entity Framework 、ASP.NET 和 C#3.5我借用了以下代码,使用 GridView 中的 sortExpression 而不是实体的属性来进行排序:

    public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression)
{
string[] sortParts = sortExpression.Split(' ');
var param = Expression.Parameter(typeof(T), string.Empty);

var property = Expression.Property(param, sortParts[0]);

var sortLambda = Expression.Lambda<Func<T, object>>(Expression.Convert(property, typeof(object)), param);

if (sortParts.Length > 1 && sortParts[1].Equals("desc", StringComparison.OrdinalIgnoreCase))
{
return source.AsQueryable<T>().OrderByDescending(sortLambda);
}

return source.AsQueryable<T>().OrderBy(sortLambda);
}

问题是 LINQ to Entities 不支持转换为对象。我需要实际的返回类型而不是对象,而不是 Func。我想出了怎么做:

    public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression)
{
string[] sortParts = sortExpression.Split(' ');
var param = Expression.Parameter(typeof(T), string.Empty);

var property = Expression.Property(param, sortParts[0]);

// NEW CODE HERE
Type propertyType = property.Type;
Type lambdaType = typeof(Func<,>).MakeGenericType(typeof(T), propertyType);
var sortLambda = Expression.Lambda<Func<T, object>>(Expression.Convert(property, propertyType), param);
//var sortLambda = Expression.Lambda<Func<T, object>>(Expression.Convert(property, typeof(object)), param);

if (sortParts.Length > 1 && sortParts[1].Equals("desc", StringComparison.OrdinalIgnoreCase))
{
return source.AsQueryable<T>().OrderByDescending(sortLambda);
}

return source.AsQueryable<T>().OrderBy(sortLambda);
}

现在的问题是,如果我有一个 Int32,它不会转换为对象,它仍然是返回类型。我是这样解决的:

    public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression)
{
string[] sortParts = sortExpression.Split(' ');
var param = Expression.Parameter(typeof(T), string.Empty);

var property = Expression.Property(param, sortParts[0]);

// New code here
Type propertyType = property.Type;
Type lambdaType = typeof(Func<,>).MakeGenericType(typeof(T), propertyType);

// NEWEST CODE HERE
var sortLambda = Expression.Lambda(lambdaType, Expression.Convert(property, propertyType), param);
//var sortLambda = Expression.Lambda<Func<T, object>>(Expression.Convert(property, propertyType), param);
//var sortLambda = Expression.Lambda<Func<T, object>>(Expression.Convert(property, typeof(object)), param);


if (sortParts.Length > 1 && sortParts[1].Equals("desc", StringComparison.OrdinalIgnoreCase))
{
return source.AsQueryable<T>().OrderByDescending(sortLambda);
}

return source.AsQueryable<T>().OrderBy(sortLambda);
}

然而,这不再编译。错误是:

The type arguments for method 'System.Linq.Enumerable.OrderByDescending(System.Collections.Generic.IEnumerable, System.Func)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

问题是我不想明确指定类型参数。

有谁知道如何解决这个问题或以任何方式从“propertyType”推断出 TResult 类型?

最佳答案

使用的方法 here , 与 refinement here ,应该做你需要的。必要时它使用反射来做中间的胆量,但它有效。另请注意,Expression.GetFuncTypeExpression.GetActionType 可以避免您的方法中的一些工作。

关于c# - 如何从实际类型推断 TResult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2774480/

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