Ich versuche, Reflektion zu verwenden, um eine Ansicht automatisch zu generieren. Html.DisplayFor
und einige der anderen Helfer nehmen Expression<Func<,>>
, die von LambdaExpression
abgeleitet ist. Schien wie ich in der Lage sein würde, um manuell mein eigenes Lambda zu erzeugen und dann das in passieren, aber es ist diesen Fehler zu werfen:Kann ich einen LambdaExpression-Typ für MVCs HTML-Helfer verwenden?
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.`
Hier ist mein Markup:
<tr>
@foreach (var pi in Model.GetType().GetProperties())
{
<td>
@Html.DisplayFor(ExpressionHelpers.GetPropertyGetterLambda(pi))
</td>
}
</tr>
ich mir ziemlich sicher bin, was ist passiert Das .DisplayFor
erfordert generische Typ Argumente, um die Typen für Func<TModel, TValue>
abzuleiten, aber ich verwende LambdaExpression
, die die Typen versteckt.
Es scheint die einzige Möglichkeit zu tun, was ich will ist, einen Ausdruck zu erstellen/kompilieren, der tatsächlich .DisplayFor
mit typsicheren Argumenten aufruft, aber das scheint übermäßig kompliziert.
Gibt es eine andere Möglichkeit, mein Ziel zu erreichen, oder wäre es besser, wenn ich die Ergebnisse direkt an den HTML-Code übermittele, anstatt die Helfer anzurufen?
Edit: Per Anfrage, hier ist der Code für 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;
}
}
können Sie diese Methodenimplementierung zeigen? –
@EhsanSajjad Aktualisiert – oscilatingcretin