在 Expression<Func<TModel, Object>> 中计算参数结果

Posted

技术标签:

【中文标题】在 Expression<Func<TModel, Object>> 中计算参数结果【英文标题】:Evaluate Parameter Result Within Expression<Func<TModel, Object>> 【发布时间】:2014-07-12 01:40:57 【问题描述】:

评估代表

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

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


调用 DoSomething 方法

以下 TModelNames 属性中有一个名称列表,我想从 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);

【问题讨论】:

【参考方案1】:

您已经定义了通过m =&gt; 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。是的,这行得通。使用 helperVariable.ViewData.Model 作为实例,它现在可以工作了。干杯。 Invoke 对于编译后的Func&lt;&gt; 没有暗示,所以你可以说f(model)【参考方案2】:

您的 DoSomething,因为它是 Func,将接收一个函数,该函数接收一个 TModel 并返回一个字符串。为了调用名称列表,正如您所写,您需要以下重载

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

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

【讨论】:

我可以处理结果。我只想对传递给委托的列表做一些事情。如果我能把它当作一个对象(传入的列表),我应该能够像你所说的那样强制转换或键入它。

以上是关于在 Expression<Func<TModel, Object>> 中计算参数结果的主要内容,如果未能解决你的问题,请参考以下文章

Expression<Func<T,TResult>>和Func<T,TResult> 与AOP与WCF

将 .net Func<T> 转换为 .net Expression<Func<T>>

Expression<Func<T,bool>> 声明是啥意思?

AndAlso 在几个 Expression<Func<T, bool>> 之间:从范围引用

从 Expression<Func<T, bool>> 转换为字符串

将 Expression<Func<T, bool>> 作为参数传入的 Moq'ing 方法