是否可以从Web服务调用返回ExpandoObject?

Mer*_*ovi 3 c# web-services dynamic asmx

我想从WebMethod返回一个ExpandoObject,如下所示:

[WebMethod]
public ExpandoObject TestMethod(int val)
{
     dynamic item = new ExpandoObject();

     item.Value = val;
     item.SomeOtherStuff = "SomeOtherStuff";

     DynamicallyAddMoreFields(item);

     return item;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,我收到此错误:

要成为XML可序列化,从IEnumerable继承的类型必须具有Add(System.Object)的实现

我无法扩展ExpandoObject类,因为它是密封的.

是否有可能以其他方式做到这一点?

Enr*_*lio 8

您可以通过继承DynamicObject并实现ISerializable来创建自己的可序列化版本ExpandoObject类.

所述ExpandoObject基本上与值存储动态附加属性的名称一起他们的字典:

[Serializable]
public class SerializableExpandoObject : DynamicObject, ISerializable
{
    private Dictionary<string, object> properties = new Dictionary<string, object>()

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        return properties.TryGetValue(binder.Name, out result);
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        properties.Add(binder.Name, value);
        return true;
    }

    ....
}
Run Code Online (Sandbox Code Playgroud)

从这里,您可以实现需要支持的任何序列化格式,包括IXmlSerializable.