【问题标题】:Is it possible to return ExpandoObject from web service call?是否可以从 Web 服务调用返回 ExpandoObject?
【发布时间】:2012-03-13 22:14:24
【问题描述】:

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

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

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

     DynamicallyAddMoreFields(item);

     return item;
}

当我尝试这样做时,我得到了这个错误:

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

我不能扩展 ExpandoObject 类,因为它是密封的。

是否可以通过其他方式做到这一点?

【问题讨论】:

  • 如果某个 java 客户端想要使用你的方法怎么办?您应该始终返回众所周知的类型。 --编辑:Web 服务是客户端和服务器之间的合同。这里的合同是什么,你还给客户什么?一个可以包含任何内容的 ExpandoObject。
  • @L.B 在这种特定情况下,这不是问题,因为客户将读取结果 XML,该结果将始终具有基于已知参数的相同结构,并且此 WS 仅供公司内部使用。

标签: c# web-services dynamic asmx


【解决方案1】:

您可以通过从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;
    }

    ....
}

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

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 2012-11-16
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多