我想用反射來自動生成一個視圖。 Html.DisplayFor
和一些其他助手採取Expression<Func<,>>
從LambdaExpression
派生。好像我可以手動生成自己的λ,然後把它傳遞,但它拋出這個錯誤:我可以爲MVC的HTML幫助程序使用LambdaExpression類型嗎?
The type arguments for method 'DisplayExtensions.DisplayFor<TModel, TValue>(HtmlHelper<TModel>, Expression<Func<TModel, TValue>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.`
這裏是我的標記:
<tr>
@foreach (var pi in Model.GetType().GetProperties())
{
<td>
@Html.DisplayFor(ExpressionHelpers.GetPropertyGetterLambda(pi))
</td>
}
</tr>
我敢肯定發生了什麼事是.DisplayFor
需要泛型類型參數來推斷Func<TModel, TValue>
的類型,但我使用的是隱藏類型的LambdaExpression
。
這似乎是唯一的方法來做我想要的是建立/編譯一個表達式,實際上使用類型安全參數調用.DisplayFor
,但似乎過於複雜。
是否有另一種方式來實現我的目標,或者我會更好的直接輸出結果到HTML而不是調用幫助者?
編輯:每請求,這裏的代碼GetPropertyGetterLambda
:
public static LambdaExpression GetPropertyGetterLambda(PropertyInfo pi, BindingTypeSafety TypeSafety)
{
if (pi.CanRead)
{
ParameterExpression entityParameter = Expression.Parameter(TypeSafety.HasFlag(BindingTypeSafety.TypeSafeEntity) ?
pi.ReflectedType : typeof(object));
LambdaExpression lambda = Expression.Lambda(GetPropertyReadExpression(entityParameter, pi, TypeSafety), entityParameter);
return lambda;
}
else
{
return null;
}
}
你能顯示那個方法的實現嗎? –
@EhsanSajjad更新 – oscilatingcretin