jwi*_*ize 2 c# linq asp.net-mvc lambda expression-trees
评估代表
我有一个表达式,我使用一个参数,我想在下面的DoSomething函数中使用它的结果.
public void DoSomething <TModel>(Expression<Func<TModel, String>> func){
}
Run Code Online (Sandbox Code Playgroud)
调用DoSomething方法
以下TModel在Names属性中有一个名称列表,我想在DoSomething方法中访问它.我无法弄清楚如何做到这一点.
DoSomething(m => m.Names);
Run Code Online (Sandbox Code Playgroud)
试图编译没有成功
...
func.Compile().Invoke([need m.Names]) in here.
Run Code Online (Sandbox Code Playgroud)
我的现实代码看起来像这样
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);
}
Run Code Online (Sandbox Code Playgroud)
您已定义了传递给方法的表达式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);
}
Run Code Online (Sandbox Code Playgroud)
这种方法的用法是:
DoSomething(m => m.Names, modelInstance);
Run Code Online (Sandbox Code Playgroud)
这只是一个如何使用,编译和调用表达式的例子.你需要决定这样的东西是否有意义,并在你的域中找到应用程序.
| 归档时间: |
|
| 查看次数: |
3134 次 |
| 最近记录: |