2016-06-22 4 views
1

ネストされたクラスのコントローラーでDynamicObjectから継承していますが、ActionMethodでプロパティを作成しようとすると失敗します。オブジェクトネストされたクラスのコントローラのDynamicObjectから継承がActionMethodでプロパティを作成できません

SearchController.MyClass' does not contain a definition for 'Test'エラーですが、クラス自体はコントローラで宣言されているため、どのように表示されないのかわかりません。 DynamicObjectから継承する場合、ダイナミックプロパティを設定するにはどうすればよい

public class MyClass : DynamicObject 
{ 
    public string Prop { get; set; } 
} 

public ActionResult Test() 
{ 
    var test = ((dynamic)new MyClass()).Test = "sfdsdf"; // KABOOM here 
.... 
} 

、これはなぜ失敗するのか?

答えて

2

ExpandoObjectによって提供される動作が期待されているようです。ただし、DynamicObjectは、実行時の動的動作を指定するための基本クラスである

です。

クラス自体は、任意の機能を提供していますが、ドキュメントの備考セクションで説明したように、必要なだけのメソッドをオーバーライドしていることを実現することができますされていません。

実装するには動的な動作の場合は、DynamicObjectクラスから継承し、必要なメソッドをオーバーライドすることができます。たとえば、プロパティを設定および取得する操作のみが必要な場合は、TrySetMemberおよびTryGetMemberメソッドをオーバーライドできます。

ので、動的にサポートし、実行時にプロパティを追加するために、あなたには、いくつかのストレージを宣言し、前述の方法を処理する必要があり、このような(彼らはあなたのクラスの本当の性質のために呼び出されないことに注意してください)

public class MyClass : DynamicObject 
{ 
    public string Prop { get; set; } 

    Dictionary<string, object> dynamicMembers = new Dictionary<string, object>(); 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     dynamicMembers[binder.Name] = value; 
     return true; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     return dynamicMembers.TryGetValue(binder.Name, out result); 
    } 
} 
は今、これは動作します:

var c = (dynamic)new MyClass(); 
c.Test = "sfdsdf"; // No KABOOM here :) 
+1

こんにちはイワンは、私の防衛のために私は.NETのデフォルトの実装が存在しないことは非常に驚くべきことであると言うことができます。 'DynamicObject'のために。私は私たちの仕事の時間帯が重なり合うようにとても幸せです:) –

関連する問題