2011-12-29 10 views
4

、私はこのような何かをしたいと思います:かみそりでDLRで動的な特性評価

class MyClass { 
    int MyProperty { get; set; } 
} 

が、私はこのような何かをするだろう。これは出力MyPropertyの文字列表現を希望

@InstanceOfMyClass.MyProperty 

InstanceOfMyClassMyClassのインスタンスに見えるいくつかの動的オブジェクトです)。

これを行うと今や

@InstanceOfMyClass.MyMissingProperty 

"Missing:MyMissingProperty"を出力したいと思います。私はそのように表現全体を捉えるのが大好きです。が、それはDLRの多くを尋ねることがあります

@InstanceOfMyClass.MyMissingProperty.MoreMissing 

は、潜在的に出力が「MyMissingProperty.MoreMissingがありません」でした。

ExpandoObjectは私にこれを許可しますか?そうでない場合は、これを実装するために何をする必要がありますか?

答えて

3

オーバー書き、その後DynamicObjectの独自のバージョンを作成することにより、このようにDynamicObject.TryGetMemberを拡張することを実現することができます:

メンバーが存在する場合は、値を返します。メンバが存在しない場合は、不足しているプロパティの文字列表現とチェーンの両方を扱うクラスの新しいインスタンスを返します。このようなもの

public class MissingPropertyChain : DynamicObject 
{ 
    private string property; 

    public MissingPropertyChain(string property) 
    { 
     this.property = property; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     if(binder.Name == "ToString") 
      result = "Missing property: " + property; 
     else 
      result = new MissingPropertyChain(property + "." + binder.Name; 

     return true; 
    } 
} 

私はそれを試していないが、それはあなたに問題を解決する方法のアイデアを与えると思います。

希望します。

0

Expandoについてはわかりませんが、プロパティを設定して取得するときに使用されます。あなたが書いたものから、の値は以前には設定されていないものを読むことができるように思えます。

これには、DynamicObjectを使用できます。 TryGetMemberをオーバーライドするだけです。

関連する問題