在Expression<Func<TModel, Object>>中评估参数结果

4

评估委托

我有一个表达式,其中使用了一个参数,我想在下面的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);
}
2个回答

12

你已定义了一个表达式,通过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);

这只是一个使用、编译和从表达式调用的示例,您需要决定在您的领域中是否有意义并找到应用。


事实上,我的第一个参数是HtmlHelper<TModel>。是的,那样可以。我使用helperVariable.ViewData.Model作为实例,现在它可以工作了。干杯。 - jwize
对于已编译的 Func<>,难道不是暗示了 Invoke,因此你可以只说 f(model) 吗? - NetMage

0

你的 DoSomething,因为它是一个 Func,将接受一个函数,该函数接受一个单一的 TModel 并返回一个单一的字符串。为了针对名称列表进行调用,就像你所编写的那样,你需要以下重载

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

然后将每个字符串作为结果传递。我建议使用一个辅助方法来处理结果字符串的工作,并从每个接受Funcs的DoSomething重载中调用它。


我可以处理结果。我只想对传递到委托的列表执行某些操作。如果我可以将其作为对象获取(传递的列表),我应该能够像您所述那样进行强制转换或类型转换。 - jwize

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接