将属性名称作为字符串转换为Linq表达式
本文关键字:字符串 转换 Linq 表达式 属性 | 更新日期: 2023-09-27 18:25:52
我需要将表示接口上属性名称的字符串转换为表达式。我大部分都在工作,只有一件我最后想不出来。
static Expression<Func<T, int>> MakeGetter<T>(string propertyName)
{
var input = Expression.Parameter(typeof(T));
var property = typeof(T).GetProperty(propertyName) ??
GetProperty(propertyName, typeof(T));
var expr = Expression.Property(input, property);
var propType = property.PropertyType.Name;
switch (propType.ToLower())
{
case "string":
return Expression.Lambda<Func<T, string>>(expr, input);
case "int":
return Expression.Lambda<Func<T, int>>(expr, input);
}
}
private static PropertyInfo GetProperty(string propertyName, Type i)
{
var baseInterfaces = i.GetInterfaces();
foreach (var baseInterface in baseInterfaces)
{
var property = baseInterface.GetProperty(propertyName);
return property ?? GetProperty(propertyName, baseInterface);
}
return null;
}
我遇到的一个问题是,在MakeGetter函数的末尾,我不知道该函数是字符串、int还是其他类型,在我完成所有反射之前,我无法知道,所以我如何创建这个方法,使其成为泛型并正确返回表达式。
看看在运行时生成lambda表达式的示例。文章中的这些行显示了如何生成lambda表达式:
var parameterExpression = Expression.Parameter(typeof(TEntity), "x");
var memberExpression = Expression.PropertyOrField(parameterExpression, prop.Name);
var memberExpressionConversion = Expression.Convert(memberExpression, typeof(object));
var lambda = Expression.Lambda<Func<TEntity, object>>(memberExpressionConversion, parameterExpression);
既然你已经在评论中声明了你的意图,我相信这里接受的答案就是你想要的。即使它没有做你想要的事情,这些线路也可以继续:
// TODO: Get 'type' from the property you want.
Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
您可以返回LambdaExpression
,或者只使用该答案中的扩展方法,或使用DynamicLinq。我想这个故事的寓意(就像它经常发生的那样)是它可能已经完成了:)。