如果我有一个产品类:
public class Product
{
public string Title { get; set; }
public string Make { get; set; }
public Decimal Price { get; set; } //(Edit) - Added non-string
}
我在另一个类中声明了一个属性:
Func<Product, object> SortBy { get; set; }
我可以使用:
设置SortBySortBy = p => p.Title;
但是,如果我将SortBy的属性名称存储为字符串,我将如何使用反射进行相同的赋值,例如。
string sortField = "Title";
SortBy = /*Some reflection using sortField*/;
答案 0 :(得分:5)
您需要使用expression trees在运行时创建新方法:
var p = Expression.Parameter(typeof(Product));
SortBy = Expression.Lambda<Func<Product, object>>(
Expression.Property(p, sortField),
p
).Compile();
要使用值类型,您需要插入一个强制转换:
var p = Expression.Parameter(typeof(Product));
SortBy = Expression.Lambda<Func<Product, object>>(
Expression.TypeAs(Expression.Property(p, sortField), typeof(object)),
p
).Compile();
答案 1 :(得分:2)
要使其与十进制和其他值类型一起使用,您可以使用泛型:
static void SetSortBy<T>(string sortField) {
var m = typeof(Product).GetProperty(sortField).GetGetMethod();
var d = Delegate.CreateDelegate(typeof(Func<Product, T>), m)
as Func<Product, T>;
SortBy = product => d(product);
}
...
SetSortBy<decimal>("Price");
SetSortBy<object>("Title"); // or <string>
答案 2 :(得分:1)