2016-08-22 6 views
1

私はモデル式を取り、のように、その値を持つ何かをするヘルパーメソッド構築しています:C#の式で孫の価値を得るには?

Html.EditorFor(expression)

を(私はとして使用することができます:私は、このような方法を実装しましたHtml.EditorFor(m => m.Name)

以下のように:

public static MvcHtmlString MyMethod<TModel, TProperty>(this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TProperty>> expression) 
{ 
    TModel dataModel = html.ViewData.Model; 
    MemberExpression mexp = expression.Body as MemberExpression; 
    PropertyInfo pinfo = mexp.Member as PropertyInfo; 
    string currentValue = dataModel != null ? pinfo.GetValue(dataModel) as string : null; //exception on this line 
    [do something with the value...] 
} 

これはグラムにしよう、などmodel.Nameなどのモデルの直接の子の値を取得するための、より高い程度の参照のために働きますら例えばmodel.SomeChild.Nameなどの値が例外をスローしていくつかの調査の後

Object does not match target type.

、それがメンバーの発現がプロパティ情報がNameに情報を保持SomeChildを参照していることがわかります。値を取得しようとすると、その意味でmodel.Nameを取得しようとし、クラッシュします。

C#で式を使用して孫の価値を得るにはどうすればよいですか?

+0

実際の値を取得しようとしているだけの場合は、 'Func ではなく式をとっている理由がありますか?もちろん、表現をデリゲートにコンパイルすることはできますが、そのことについてはパフォーマンスの影響はあまりありません。 –

+0

@JonSkeetまた、私はHTMLを生成するためにメンバ/プロパティ名を含む完全な式を保持して、ポストバック時にその値を私のモデルに戻してバインドする必要があります。 ASP.NET MVCコンポーネントとして使用され、 'Html.XFor(m => m.Property)'の規約を維持したいと思います。 –

+1

そして、残りの部分は 'Html.XFor(m => m.Foo.Bar)'を実際に持っていますか? –

答えて

1

Namemodel.SomeChild.Nameは、モデルクラスのプロパティではありません。ネストされたプロパティはありません。 Nameは、SomeChild get操作によって返されたオブジェクトのプロパティ取得操作です。それはget_Name(get_SomeChild(model))またはmodel.get_SomeChild().get_Name()(擬似コード)のようなビットです。

コードでは、MemberExpressionsを再帰的にアンパックして、それらから文字列を作成する必要があります。

+0

ああ、再帰的に表現木をたどる必要がありますか? –

+0

はい。 C#コンパイラでツリーを生成し、デバッガでそれを調べます。視覚化はひどいですが、あなたは構造を作り出すことができます。 – usr

+0

大丈夫、私はそれに潜入するでしょう。私はもっ​​と頑丈な/組み込みの方法があるかもしれないと思ったが、明らかにそこにない。 –

関連する問題