gpt4 book ai didi

c# - 网络核心 : Find Data Type for any Variable Field in Class

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

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

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

成员(member)类型,获取类型(),字段类型

OrderBy Expression Tree in Net Core Linq for Extension Method

创建表达式:

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

最佳答案

因为类型在编译时是未知的,你将不能使用像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);
}
}

引用 How to: Use Expression Trees to Build Dynamic Queries (C#)

像这样使用

//IEnumerable<Person> records...
var data = records.OrderByProperty("Name");

关于c# - 网络核心 : Find Data Type for any Variable Field in Class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57617643/

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