public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
where T : EntityObject
{
var param = Expression.Parameter(typeof(T), "o");
var body = Expression.PropertyOrField(param,columnName);
var sortExpression = Expression.Lambda(body, param);
return query.OrderBy(sortExpression);
}
Run Code Online (Sandbox Code Playgroud)
因为OrderBy的类型不是从sortExpression中推断出来的,所以我需要在运行时指定类似的东西:
var sortExpression = Expression.Lambda<T, TSortColumn>(body, param);
Run Code Online (Sandbox Code Playgroud)
要么
return query.OrderBy<T, TSortColumn>(sortExpression);
Run Code Online (Sandbox Code Playgroud)
我不认为这是可能的,因为TSortColumn只能在运行时确定.
有没有解决的办法?
给出以下对象:
public class Customer {
public String Name { get; set; }
public String Address { get; set; }
}
public class Invoice {
public String ID { get; set; }
public DateTime Date { get; set; }
public Customer BillTo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想用反射Invoice来获得一个Name属性Customer.这就是我所追求的,假设这段代码可行:
Invoice inv = GetDesiredInvoice(); // magic method to get an invoice
PropertyInfo info = inv.GetType().GetProperty("BillTo.Address");
Object val = info.GetValue(inv, null);
Run Code Online (Sandbox Code Playgroud)
当然,由于"BillTo.Address"不是Invoice该类的有效属性,因此失败.
所以,我尝试编写一个方法将字符串拆分成句点,并遍历对象寻找我感兴趣的最终值.它可以正常工作,但我对它并不完全满意:
public Object GetPropValue(String …Run Code Online (Sandbox Code Playgroud)