我有一個DynamicObject
,我希望它可以轉換爲IDictionary,與ExpandoObject
完全一樣。例如,鑄造ExpandoObject到IDictionary的是完全合法:爲什麼我不能在隱式轉換時返回接口,但是ExpandoObject可以嗎?
dynamic ex = new ExpandoObject();
ex.Field = "Foobar";
IDictionary<string, object> dict = ex as IDictionary<string, object>;
Console.WriteLine (dict["Field"]);
現在我儘量落實到我自己的DynamicObject這樣的:
public class MyDynamicObject : DynamicObject
{
public Dictionary<string, object> members = new Dictionary<string, object>();
public override bool TryGetMember (GetMemberBinder binder, out object result)
{
if (members.ContainsKey (binder.Name)) {
result = members[binder.Name];
return true;
}
else {
result = null;
return false;
}
}
public override bool TrySetMember (SetMemberBinder binder, object value)
{
this.members.Add (binder.Name, value);
return true;
}
public static implicit operator IDictionary<string, object> (MyDynamicObject mydo)
{
return (IDictionary<string, object>) mydo.members;
}
}
但是,編譯器將無法在public static implicit operator IDictionary<string, object>
線,給人錯誤:「不能轉換爲或從一個接口類型」。如果我將隱式運算符更改爲Dictionary,則可以將MyDynamicObject強制轉換爲沒有任何問題的Dictionary,但不是IDictionary。
ExpandoObject如何做到這一點?
對於OP--你所需要做的就是:做到這一點,即'public class MyDynamicObject:DynamicObject,IDictionary'並填寫缺少的方法 –
感謝您的快速響應!你的回答很有道理。不過,我將只需添加Dictionary並將其轉換爲Dictionary,這足以滿足我的項目需求。 –
Dyna
使用ReSharper,此任務在2分鐘內通過「委派成員」選項完成。 –