在Expression>中求值参数结果

本文关键字:参数 结果 值参 Object Expression Func TModel | 更新日期: 2023-09-27 18:04:37

评估委托

我有一个表达式,我使用一个参数,我想使用下面DoSomething函数的结果。

public void DoSomething <TModel>(Expression<Func<TModel, String>> func){
}

调用DoSomething方法

下面的TModel names 属性中有一个名称列表,我想从DoSomething方法中访问它。我不知道该怎么做。

DoSomething(m => m.Names);

编译失败

... 
func.Compile().Invoke([need m.Names]) in here. 

我的代码在现实中看起来是这样的

public static HelperResult TestFor<TModel>(
        ExtendedPageBaseClass<TModel> page,
    Expression<Func<TModel, object>> valueField,
    Expression<Func<TModel, object>> displayField,
    Expression<Func<TModel, ICollection>> list, 
        Object defaultValue = null, String changedEvent = null)   
{
    var idField = valueField.GetName();
    var label = displayField.GetName();
    var display = page.Html.NameFor(displayField).ToString();
    var data = list.Compile().Invoke(page.Html.ViewData.Model);
    return IsolatedSelectorFor(page, idField, display, label, data);
}

在Expression<Func<TModel, Object>>中求值参数结果

您已经定义了通过m => m.Names传递给方法的表达式。然而,这只是一个函数,它将TModel作为输入并返回名称列表。注意,在这一点上,您仍然没有传递任何对象。它只是对函数的描述。

因此,您需要有一个模型的实例,以便将其传递给函数并调用它。这样就可以了:

 public static void DoSomething<TModel>(Expression<Func<TModel, List<string>>> selectNamesFunc, TModel model)
 {
     var f = selectNamesFunc.Compile();
     var names = f.Invoke(model);
 }

这个方法的用法是:

DoSomething(m => m.Names, modelInstance);

这只是一个如何使用、编译和调用from表达式的例子。你需要决定这样的东西是否有意义,是否能在你的领域找到应用。

你的DoSomething,因为它是一个Func,将接受一个函数,该函数接受一个TModel并返回一个字符串。如前所述,为了对名称列表进行调用,您将需要以下重载

public void DoSomething<TModel>(Expression<Func<TModel, IEnumerable<string>>> func) ...

然后传递每个字符串作为结果。我建议使用助手方法来处理结果字符串上的工作,并从每个接受Funcs

的DoSomething重载中调用它。