があり、DynamicObject
とまったく同じように IDictionary にキャストできるようにしたいExpandoObject
。たとえば、 ExpandoObject を IDictionary にキャストすることは完全に有効です。
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 はどのようにこれを行いますか?