将属性名称作为字符串转换为Linq表达式

时间:2013-08-01 13:42:21

标签: c# linq expression

我需要将表示接口上属性名称的字符串转换为表达式。我大部分都在工作,最后只有一件我无法弄清楚。

 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或其他类型,并且在我做完所有反射之后无法知道,所以如何创建此方法,以便它是通用的,并将正确返回表达式。

2 个答案:

答案 0 :(得分:1)

在运行时生成lambda表达式的示例中查看here。文章中的这些行显示了如何生成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);

答案 1 :(得分:0)

既然您已在评论中宣布了您的意图,我相信您接受的答案here正是您所寻求的。即使它没有完全符合您的要求,这些线也可以继续:

// 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。我想故事的寓意(通常是这样)可能已经完成了:)。