簡體   English   中英

使用反射獲取Lambda表達式內的屬性值

[英]Get Value of Property inside a Lambda Expression using Reflection

我有一個名為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。 如何解決這個問題呢?

您正在尋找的可能類似於以下內容:

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傳遞。

像這樣使用它:

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

var lambda = SearchMethod<TbStore>(search);

或者,您可以使用System.Linq.Dynamic.Core獲得類似的內容。

var result = db.Where(searchDetails.ColName + ".Contains(@0)", searchDetails.SearchVal);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM