使用反射获取Lambda表达式内的属性值

时间:2018-07-04 08:55:38

标签: c# reflection lambda expression

我有一个名为SearchDetails的对象,其中包含:

SearchDetails: 
{ ColName: "StrName"
  SearchVal" "mega" }

我正在使用反射方法制作一个通用的lambda表达式。

    public dynamic searchMethod(object SearchDetails)
    {
        ParameterExpression Parameter = Expression.Parameter(typeof(SearchDetails), "x");

        var searchCol = Expression.Property(
         Parameter,
         SearchDetails.GetType().GetProperty("ColName")

       );
        var colVal = Expression.Property(
          Parameter,
          SearchDetails.GetType().GetProperty("SearchValue").Name
        );

       Expression contMethod = Expression.Call(searchCol, "Contains", null, colVal);
        Expression<Func<SearchDetails, bool>> lambda =
           Expression.Lambda<Func<SearchDetails, bool>>(contMethod, Parameter);

        return lambda;
    }

问题是我得到的lambda表达式如下:

{x => x.ColName.Contains(x.SearchValue)}

但是,我希望它像这样:{x => x.StrName.Contains("megabrand")}。 我无法访问属性的值:ColName和SearchValue。 如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您正在寻找的可能与此类似:

TcpNsc

请注意,您必须将表的类型传递到某个地方,在这种情况下,将其作为通用参数public static Expression<Func<TSource, bool>> SearchMethod<TSource>(SearchDetails searchDetails) { ParameterExpression par = Expression.Parameter(typeof(TSource), "x"); var col = Expression.Property(par, searchDetails.ColName); Expression body = Expression.Call(col, "Contains", null, Expression.Constant(searchDetails.SearchVal)); var lambda = Expression.Lambda<Func<TSource, bool>>(body, par); return lambda; }

使用方式:

TSource

作为替代方案,您可以使用System.Linq.Dynamic.Core获取类似内容。

var search = new SearchDetails
{
    ColName = "Foo",
    SearchVal = "Bar",
};

var lambda = SearchMethod<TbStore>(search);