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

C# 使用反射获取Lambda表达式内的属性值,c#,reflection,lambda,expression,C#,Reflection,Lambda,Expression,我有一个名为SearchDetails的对象,其中包含: SearchDetails: { ColName: "StrName" SearchVal" "mega" } 我正在使用反射方法生成一个通用的lambda表达式 public dynamic searchMethod(object SearchDetails) { ParameterExpression Parameter = Expression.Parameter(typeof(SearchD

我有一个名为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;
    }
但是,我希望它是这样的:
{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;
}
作为一种替代方法,你可以用它来获得类似的东西

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

很不清楚你在问什么。。。我们不知道StrName是什么,也不知道从哪里可以得到字符串“megabrand”来自…然后不清楚为什么不能简单地使用
SearchDetails SearchDetails
作为
searchMethod
@xanatos的参数。首先,我有一个名为SearchDetails的对象,其中包括键ColName及其值:“StrName”。(SearchDetails:{ColName:“StrName”SearchVal“mega”})我之所以使用此方法,是因为我必须生成通用lambda表达式,其中为了能够发送许多通用参数,您是否正在尝试创建
表达式类型的lamda?因为我无法理解您正在尝试执行的操作。如果
SearchDetails
是描述符“您要执行的搜索,执行搜索的对象是什么?在
{x=>x.StrName.Contains(“megabrand”)}中
x
的类型是什么?”
?@xanatos我正在使用数据库。在我的数据库中,我有一个表,可以从中获取搜索结果。我要获取的结果是:Expression lambda=Expression.lambda(contMethod,Parameter);其中TbStore是我正在使用的数据库表。searchDetail是包含用户输入的输入文本和用户希望其搜索结果的列名的对象
var search = new SearchDetails
{
    ColName = "Foo",
    SearchVal = "Bar",
};

var lambda = SearchMethod<TbStore>(search);
var result = db.Where(searchDetails.ColName + ".Contains(@0)", searchDetails.SearchVal);