创建一个包含lambda的列表
在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>
}
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)
}
我创建类似的东西(请参阅我的更新) 但仍然错误 //无法根据用法推断类型参数。尝试明确指定类型参数 –
@黄天文您的代码不相似。当我使用'Expression
好吧,似乎可以在IDE中工作,但我不知道如果MVC足够智能转换表达式
提高对@ 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});
}
}
谢谢..因为急需项目的需要,我已经使用其他丑陋的方式,但会测试这个,如果我有时间..似乎将工作 –
可能是'List>'?但不是一个好主意。 –
mshsayem
使用表达式树? –
@mshsayem但Func