2015-12-03 118 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

謝謝..因爲急需項目的需要,我已經使用其他醜陋的方式,但會測試這個,如果我有時間..似乎將工作 –

相關問題