リフレクションを使用してビューを自動生成しようとしています。 Html.DisplayFor
と他のヘルパーのいくつかはLambdaExpression
に由来するExpression<Func<,>>
となります。私は何が起こっているのかかなり確信していますMVCのHTMLヘルパーにLambdaExpression型を使用できますか?
<tr>
@foreach (var pi in Model.GetType().GetProperties())
{
<td>
@Html.DisplayFor(ExpressionHelpers.GetPropertyGetterLambda(pi))
</td>
}
</tr>
:ここ
は私のマークアップです:私は手動で自分のラムダを生成し、それを渡すことができるだろうが、それはこのエラーを投げているように見えました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.`
.DisplayFor
はタイプを推測するために汎用タイプの引数を必要としますが、タイプを隠している
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 Updated – oscilatingcretin