Dyn*_*lon 2 c# casting interface dynamic expandoobject
我有一个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"]);
Run Code Online (Sandbox Code Playgroud)
现在我尝试将它实现到我自己的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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是编译器将public static implicit operator IDictionary<string, object>在线路上失败,给出错误:"无法转换为接口类型或从接口类型转换".如果我将隐式运算符更改为Dictionary,我可以将MyDynamicObject强制转换为Dictionary而不会出现任何问题,但不能将IDictionary强制转换为Dictionary.
ExpandoObject如何做到这一点?
ExpandoObject简单地实现IDictionary<string, object>.
如果您想要具有相同的行为,还需要实现此接口并将所有调用委派给您的members字段.
像这样的东西:
public class MyDynamicObject : DynamicObject, IDictionary<string, object>
{
public Dictionary<string, object> members = new Dictionary<string, object>();
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
{
return members.GetEnumerator();
}
public void Add(KeyValuePair<string, object> item)
{
members.Add(item.Key, item.Value);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
911 次 |
| 最近记录: |