我的目標是讓用戶能夠按名稱按屬性/欄位對不同物件的串列進行排序
(這些串列將顯示在帶有標題的表格中,他們可以單擊以對其進行排序)
我不確定如何在這一行中動態指定屬性/欄位的型別
Expression.Lambda<Func<T, int>>(
我已經了解了下面的代碼,但是當我按名稱排序時顯然失敗了,因為它不是 int。
class Person
{
public int Id;
public string Name;
public Person(int id, string name)
{
Id = id;
Name = name;
}
}
class Car
{
public int Id;
public DateTime Manufactured;
public Car(int id, DateTime manufactured)
{
Id = id;
Manufactured = manufactured;
}
}
class Program
{
static void Main(string[] args)
{
//Create list of people
List<Person> listOfPeople = new List<Person>
{
new Person(1,"Nick"),
new Person(2,"Barry")
};
//Sort people by Id
List<Person> peopeSortedById =
DynamicSort(
propertyOrFieldName: "Id",
list: listOfPeople);
//Sort people by Name
List<Person> peopleSortedByName =
DynamicSort(
propertyOrFieldName: "Name",
list: listOfPeople);
//Create list of cars
List<Car> listOfCars = new List<Car>
{
new Car(1,DateTime.Now),
new Car(2,DateTime.Now)
};
//Sort cars by Id
List<Car> carsSortedById =
DynamicSort(
propertyOrFieldName: "Id",
list: listOfCars);
//Sort cars by Name
List<Car> carsSortedByName =
DynamicSort(
propertyOrFieldName: "Name",
list: listOfCars);
Console.Read();
}
public static List<T> DynamicSort<T>(
string propertyOrFieldName,
List<T> list)
{
var objectType =
Expression.Parameter(typeof(T));
var propertyOrField =
Expression.PropertyOrField(
expression: objectType,
propertyOrFieldName: propertyOrFieldName);
var propertyOrFieldType =
propertyOrField.Type;
var expression =
Expression.Lambda<Func<T, int>>(
body: propertyOrField,
parameters: objectType)
.Compile(); ;
return list.AsQueryable().OrderBy(expression).ToList();
}
}
uj5u.com熱心網友回復:
我認為您不需要使用運算式 api。我建議像這樣使用反射:
private IEnumerable<T> OrderByProperty<T>(IEnumerable<T> list, string propertyName)
=> list.OrderBy(x => typeof(T).GetProperty(propertyName).GetValue(x));
您可以像這樣使用此方法:
var orderedList = OrderByProperty(toBeOrdered, nameof(FooA.PropertyName));
如果要使用 Expression Api,請確保創建 Expression<Func<T,R> 其中 R 是所選屬性的型別。請注意,您不需要編譯運算式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/428915.html
