我是一名有用的助手,可以翻译文本。
导致以下函数:
这会产生另一个问题,它无法比较数组中的两个元素(可能是因为它不知道如何在这种情况下比较对象与对象)。
我希望它能适用于任何类型,因为排序应该能够在对象的任何字段上工作(这些字段可以嵌套多层)。下面包含了重新创建我的问题所需的完整代码。
Microsoft Visual Studio Community 2022(64位)- 预览 版本17.3.0预览1.1
该项目是一个使用.NET 6的控制台应用程序。
我有一个系统,应该根据从另一个应用程序提供的排序数据列表创建一个排序表达式。排序信息以包含排序键(Object.thingtosort)和方向的对象形式给出。
我的当前解决方案是基于我从另一个堆栈溢出问题中获得的解决方案构建的,该问题在此处找到:原始问题。每当我运行以下代码时:
static Expression<Func<T, object>> ToLambda<T>(string propertyName)
{
var propertyNames = propertyName.Split('.');
var parameter = Expression.Parameter(typeof(T));
Expression body = parameter;
foreach (var propName in propertyNames)
body = Expression.Property(body, propName);
var func = Expression.Lambda<Func<T, object>>(body, parameter); //<-- line of error
return func;
}
我遇到了错误:
System.ArgumentException: 'Expression of type 'System.Int32' cannot be used for return type 'System.Object''
我尝试通过将参数转换为对象来解决这个问题,使用的方法是
Expression.Convert(body, typeof(object));
导致以下函数:
static Expression<Func<T, object>> ToLambda<T>(string propertyName)
{
var propertyNames = propertyName.Split('.');
var parameter = Expression.Parameter(typeof(T));
Expression body = parameter;
foreach (var propName in propertyNames)
body = Expression.Property(body, propName);
var convertedBody = Expression.Convert(body, typeof(object));
var func = Expression.Lambda<Func<T, object>>(convertedBody, parameter); //<-- line of error
return func;
}
这会产生另一个问题,它无法比较数组中的两个元素(可能是因为它不知道如何在这种情况下比较对象与对象)。
System.InvalidOperationException: 'Failed to compare two elements in the array.'
ArgumentException: At least one object must implement IComparable.
我希望它能适用于任何类型,因为排序应该能够在对象的任何字段上工作(这些字段可以嵌套多层)。下面包含了重新创建我的问题所需的完整代码。
Microsoft Visual Studio Community 2022(64位)- 预览 版本17.3.0预览1.1
该项目是一个使用.NET 6的控制台应用程序。
using System.Linq.Expressions;
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
string propertyForExpression = "Product.randomNumber";
Random random = new Random();
List<OrderEntity> orders = new List<OrderEntity>();
for (int i = 1; i < 11; i++)
{
var orderToAdd = new OrderEntity();
orderToAdd.id = i;
orderToAdd.name = "order number " + i;
var productToAdd = new ProductEntity();
productToAdd.id = i;
productToAdd.productName = "product " + i;
productToAdd.description = "this is a product";
productToAdd.randomNumber = random.Next(1, 100);
orderToAdd.Product = productToAdd;
orders.Add(orderToAdd);
}
var sortedOrders = orders.OrderBy(X => ToLambda<OrderEntity> (propertyForExpression));
foreach(var order in sortedOrders)
{
Console.WriteLine(order.Product.randomNumber);
}
Console.ReadKey();
}
static Expression<Func<T, object>> ToLambda<T>(string propertyName)
{
var propertyNames = propertyName.Split('.');
var parameter = Expression.Parameter(typeof(T));
Expression body = parameter;
foreach (var propName in propertyNames)
body = Expression.Property(body, propName);
var func = Expression.Lambda<Func<T, object>>(body, parameter);
return func;
}
// ToLambda function that crashes on the OrderBy with error: System.InvalidOperationException: 'Failed to compare two elements in the array.'
//static Expression<Func<T, object>> ToLambda<T>(string propertyName)
//{
// var propertyNames = propertyName.Split('.');
// var parameter = Expression.Parameter(typeof(T));
// Expression body = parameter;
// foreach (var propName in propertyNames)
// body = Expression.Property(body, propName);
// var convertedBody = Expression.Convert(body, typeof(object));
// var func = Expression.Lambda<Func<T, object>>(convertedBody, parameter);
// return func;
//}
}
public class OrderEntity
{
public int id { get; set; }
public string name { get; set; }
public ProductEntity Product { get; set; }
}
public class ProductEntity
{
public int id { get; set; }
public string productName { get; set; }
public string description { get; set; }
public int randomNumber { get; set; }
}
ToLambda
方法吗?因为它目前缺少转换,我错误地认为您是从那里得到错误而不是OrderBy
。 - ProgrammingLlama