相关疑难解决方法(0)

如何在通用扩展方法中使用字符串列名在IQueryable上应用OrderBy?

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只能在运行时确定.

有没有解决的办法?

.net c# linq entity-framework expression-trees

83
推荐指数
5
解决办法
8万
查看次数

在C#中使用反射来获取嵌套对象的属性

给出以下对象:

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)

c# reflection

69
推荐指数
6
解决办法
7万
查看次数

标签 统计

c# ×2

.net ×1

entity-framework ×1

expression-trees ×1

linq ×1

reflection ×1