我有一个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分钟内通过“委派成员”选项完成。 –