2015-12-03 122 views
0

在C#中,如何创建一个可以包含lambda的列表?创建一个包含lambda的列表

东西,我可以这样写:

//Declare list here 
list.Add(model => model.Active); 
list.Add(model => model.Name); 

,后来我可以在视图访问列表

@foreach(var lambda in list) 
    @Html.DisplayNameFor(lambda) 
@next 

如何定义这个名单?

更新:

List<Delegate> list = new List<Delegate>(); //Can accept every lambda expression 

@foreach (Delegate func in dtSetting.ColumnSettings) 
{ 
    <th width="10%"> 
     @Html.DisplayNameFor(func) // The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly 
    </th> 
} 
+0

可能是'List >'?但不是一个好主意。 – mshsayem

+0

使用表达式树? –

+0

@mshsayem但Func 不是Func

回答

0

Html.DisplayNameFor预计Expression<Func<TModel, TValue>> expression参数。

您可以创建相同TModel类型,例如对象的List并使用它:

// Somewhere in .cs file 
public List<Expression<Func<MyModel, object>>> GetListToDisplay() 
{ 
    var list = new List<Expression<Func<MyModel, object>>>(); 

    list.Add(x => x.myProperty1); 
    list.Add(x => x.myProperty2); 
    list.Add(x => x.myMethod()); 

    return list; 
} 

// In your View 
@model MyModel 
foreach (var expr in GetListToDisplay()) 
{ 
    @Html.DisplayNameFor(expr) 
} 
+0

我创建类似的东西(请参阅我的更新) 但仍然错误 //无法根据用法推断类型参数。尝试明确指定类型参数 –

+0

@黄天文您的代码不相似。当我使用'Expression >'时使用'Delegate'。试试这个,告诉我,如果它不工作。 –

+0

好吧,似乎可以在IDE中工作,但我不知道如果MVC足够智能转换表达式>到正确 表达式>或Expression >根据我们的实际定义 –

0

提高对@ Yeldar的答案,我想你可以让列表的LambdaExpression列表,然后让你自己DisplayNameFor这将工作。我对ASP.NET MVC不太熟练,但这可能会让你走上正确的道路:

public static class Extensions 
{ 
    public static void DisplayNameFor(this HtmlHelper html, LambdaExpression e) 
    { 
     if(e.Parameters.Count != 1) 
      throw new InvalidOperationException("Only lambdas of form Expression<Func<TModel, TValue>> are accepted."); 

     //Gather type parameters 
     var valueType = e.ReturnType; 
     var modelType = e.Parameters[0].Type; 

     //Get method with signature DisplayNameExtensions.DisplayNameFor<TModel, TValue>(this HtmlHelper<TModel>, Expression<Func<TModel,TValue>>) 
     var methodinfos = typeof (DisplayNameExtensions).GetMethods() 
      .Where(mi => mi.Name == "DisplayNameFor") 
      .ToList(); 
     var methodInfo = methodinfos[1]; 

     //Construct generic method 
     var generic = methodInfo.MakeGenericMethod(modelType, valueType); 

     //invoke constructed generic method 
     generic.Invoke(null, new object[] {html, e}); 

    } 
} 
+0

谢谢..因为急需项目的需要,我已经使用其他丑陋的方式,但会测试这个,如果我有时间..似乎将工作 –

相关问题