2012-06-20 37 views
0

我有興趣實現Expando接口作爲訪問非Expando格式的複雜數據的一種方式。我想要expando-like動態訪問,而不用重新格式化爲Expando對象。假一個Expando

那麼,你如何實現IDynamicMetaObjectProvider

這是一個基本ExpandoObject定義:

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

你不能只使用'動態'來指代一切嗎? 「非Expando格式的複雜數據」是什麼意思?更多的上下文真的有幫助。 –

+0

您是否考慮過從'DynamicObject'繼承?這很容易,並且不涉及「表達式」。 – phg

+0

@JonSkeet:這個想法是「將Expando映射圖層用作外觀不是一件好事。」似乎最好這樣做比通過LINQ將數據重新格式化爲另一個結構等。 – sgtz

回答

1

所以,既然你要求它,這裏的添加索引爲XElement描述here動態包裝的未經測試的例子(我沒有.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。它允許在需要基礎類型的地方使用動態包裝 - 這使得整個事情完全可怕。

最後,here's列表DynamicObject成員。這些名字是很明顯的,你可以看到你可以用對象完成的所有事情都可以被覆蓋。

+0

Alexei Levelkov的回答更加靈活,但我的工作方式很快。 – sgtz

+0

這就是動態的本質。只有'IDynamicMetaObjectProvider'賦予了_full_靈活性,代價是不得不處理表達式樹 - 這可能會很痛苦,並且不會爲像這樣的小包裝器付費。但是我總是發現'DynamicObject'已經足夠了。 – phg

3

這裏是鏈接:Implementing Dynamic Interfaces其中有一個樣品(的方式來大重新張貼在這裏...)

+0

我喜歡他們完全濫用「動態編程」這個短語。 – Mehrdad

+0

+1:這些表情嚇了我一下。 – sgtz

+0

我們生活在一個充滿活力的世界裏......現在一切都充滿活力:-D – Bond