Net Core:查找类中任何变量字段的数据类型

如何获取此 OrderBy 表达式树并使其接受任何订单类型(int、float、string、boolean 等)?是否可以?现在它的类型转换为仅字符串。我应该在调用方法时将所有内容都转换为字符串,还是有更好的方法来使更通用?

我只需要 T 类中这个 propertyName 的数据类型,这样我就可以将其放在下面的函数中。测试这些,还没有运气。

成员类型、GetType()、字段类型

Net Core Linq 中的 OrderBy 表达式树用于扩展方法

创建表达式:

public static class ExpressionTreesExtesion

{

    public static Expression<Func<T,string>> OrderByExpression<T>(this IEnumerable<T> enumerable, string propertyName)

    {

        var propInfo = typeof(T).GetProperty(propertyName);


        var collectionType = typeof(T);


        var parameterExpression = Expression.Parameter(collectionType, "x");

        var propertyAccess = Expression.MakeMemberAccess(parameterExpression, propInfo);

        var orderExpression = Expression.Lambda<Func<T,string>>(propertyAccess, parameterExpression);

        return orderExpression;

    }

}

如何致电:


var ProductExpression = records.OrderByExpression("Name");


var result  = records.OrderBy(ProductExpression.Compile());

ProductExpression.Compile() above will compile into x => x.Name, where column name is supplied at the run-time


MMMHUHU
浏览 57回答 1
1回答

九州编程

由于类型在编译时未知,因此您将无法使用强类型返回类型,例如Expression<Func<T,TKey>>.public static class ExpressionTreesExtension {    static readonly Type funcTTResult = typeof(Func<,>);    public static IOrderedQueryable<T> OrderByProperty<T>(this IEnumerable<T> enumerable, string propertyName) {        var itemType = typeof(T);        var propertyInfo = itemType.GetProperty(propertyName);        var propertyType = propertyInfo.PropertyType;        // Func<T,TPropertyType>        var delegateType = funcTTResult.MakeGenericType(itemType, propertyType);        // T x =>        var parameterExpression = Expression.Parameter(itemType, "x");        // T x => x.Property        var propertyAccess = Expression.Property(parameterExpression, propertyInfo);        // Func<T,TPropertyType> = T x => x.Property        var keySelector = Expression.Lambda(delegateType, propertyAccess, parameterExpression);        var query = enumerable.AsQueryable();        // query.OrderBy(x => x.Property)        MethodCallExpression orderByExpression = Expression.Call(             typeof(Queryable),             "OrderBy",             new[] { query.ElementType, propertyInfo.PropertyType },             query.Expression, keySelector);        // Create an executable query from the expression tree.         return (IOrderedQueryable<T>)query.Provider.CreateQuery<T>(orderByExpression);    }}并使用像//IEnumerable<Person> records... var data = records.OrderByProperty("Name");
打开App,查看更多内容
随时随地看视频慕课网APP