Я пытаюсь использовать отражение для автоматического создания представления. Html.DisplayFor
и некоторые другие помощники принимают Expression<Func<,>>
, который берет начало с LambdaExpression
. Казалось, я был бы в состоянии вручную сгенерировать свой собственный лямбда и затем передать, что, но это бросает эту ошибку:Могу ли я использовать тип LambdaExpression для HTML-помощников MVC?
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, а не называть помощников?
Edit: По желанию, вот код для 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