0

ExpandoExpando形式ではない複雑なデータにアクセスする方法としてインターフェイスを実装することに興味があります。Expandoオブジェクトに再フォーマットせずに、Expandoのような動的アクセスが必要です。

では、どのように実装しIDynamicMetaObjectProviderますか?

基本的なExpandoObject定義は次のとおりです。

ExpandoObject : IDynamicMetaObjectProvider
, IDictionary<string, object>
, ICollection<KeyValuePair<string, object>>
, IEnumerable<KeyValuePair<string, object>>
, IEnumerable
, INotifyPropertyChanged
4

2 に答える 2

3

ここにリンクがあります:サンプルを持っている動的インターフェースの実装(ここに再投稿するための大きな方法...)

于 2012-06-20T05:52:20.133 に答える
1

それで、あなたがそれを要求したので、ここXElementで説明するために動的ラッパーにインデクサーを追加するテストされていない例があります(私はこのマシンに.Net 4を持っていないので、エラーを指摘してください):

public class DynamicXMLNode : DynamicObject
{
    XElement node;
    //all the other stuff necessary...

    public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
    {

        string name = (string)indexes[0];
        result = node.Attribute(name); //maybe check for null here
        return true;
    }

    public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
    {
        string name = (string)indexes[0];
        node.SetAttributeValue(name, value);
        return true;
    }
}

これで、これを実行できるようになります(リンクで定義されている他のメソッドも使用)。

dynamic contact = new DynamicXMLNode("Contact");
contact["type"] = "business";
contact.Name = "Patrick Hines";
contact.Address = new DynamicXMLNode(); // I think it should even work without this line. Can anybody confirm this?
contact.Address["street"] = "123 Main St";
contact.Address["city"] = "Mercer Island";
contact.Address["state"] = "WA";
contact.Address["postal"] = "68402";

生産

<Contact type="business">
    <Name>Patrick Hines</Name>
    <Address street="123 Main St" city="Mercer Island" state="WA" postal="68402" />
</Contact>

例もご覧くださいTryConvert。これにより、基になる型が期待される場所で動的ラッパーを使用できるようになります。これにより、全体が完全に素晴らしいものになります。

最後に、これがメンバーリストです。DynamicObject名前は非常にわかりやすく、オブジェクトで実行できるほとんどすべてをオーバーライドできることがわかります。

于 2012-06-20T09:36:58.737 に答える