gpt4 book ai didi

c# - 为什么我不能在隐式转换时返回接口(interface),而 ExpandoObject 可以?

转载 作者:行者123 更新时间:2023-11-30 19:44:33 25 4
gpt4 key购买 nike

我有一个 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> 上失败行,给出错误:“无法转换为接口(interface)类型或从接口(interface)类型转换”。如果我将隐式运算符更改为 Dictionary,我可以毫无问题地将 MyDynamicObject 转换为 Dictionary,但不能转换为 IDictionary。

ExpandoObject 如何做到这一点?

最佳答案

ExpandoObject 简单地实现 IDictionary<string, object> .

如果你想有相同的行为,你还需要实现这个接口(interface)并将所有调用委托(delegate)给你的 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);
}

// ...
}

关于c# - 为什么我不能在隐式转换时返回接口(interface),而 ExpandoObject 可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12211044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com