[英]C# Linq expressions using the string value of a variable to set the column name in a lambda expression
我有以下元组:
Tuple<Expression<Func<Client, object>>, SortOrder>(x => x.ClientLastName, SortOrder.Descending)
在这种情况下,我知道实体-“客户端”,并且您正在使用“ ClientLastName”列。x => x.ClientLastName。
我想将其更改为实体为T的通用版本,并使用值keyValue.Key ...提供列名,例如,在这种情况下为keyValue.Key =“ ClientLastName”。
我尝试了这个:
foreach (KeyValuePair<string, SortDirection> keyValue in sortItems) {
tupleList.Add(new Tuple<Expression<Func<T, object>>, SortDirection>(x => keyValue.Key, keyValue.Value));
};
即使T是Client并且keyValue.Key是列名“ ClientLastName”
它不起作用..它只是想出了:
它不会替换keyValue.Key的值,而是在使用实际值。
d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d))
我改为:
Tuple<Expression<Func<T, object>>, SortDirection>(x => (string)typeof(T).GetProperty(keyValue.Key).GetValue(x), keyValue.Value));
哪个没有用。
如何执行x => x.keyValue.Key
替换为字符串值的keyValue.Key
,而我可以使用x => x.ClientLastName
的等效x => x.ClientLastName
?
动态构建所需的表达式并将其传递给元组
Tuple<Expression<Func<T, object>>, SortDirection> BuildTuple<T>(KeyValuePair<string, SortDirection> keyValue) {
var type = typeof(T);
var propertyInfo = type.GetProperty(keyValue.Key);
var direction = keyValue.Value;
// T x
var parameter = Expression.Parameter(type, "x");
// x.Property
var property = Expression.Property(parameter, propertyInfo);
// T x => x.Property
var expression = Expression.Lambda<Func<T, object>>(property, parameter);
return new Tuple<Expression<Func<T, object>>, SortDirection>(expression, direction);
}
循环的通用版本变为
foreach (KeyValuePair<string, SortDirection> keyValue in sortItems) {
var tuple = BuildTuple<T>(keyValue);
tupleList.Add(tuple);
};
假设它在通用方法内。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.