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

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

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

     DynamicallyAddMoreFields(item);

     return item;
}

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



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

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

最佳答案

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

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

关于c# - 是否可以从 Web 服务调用返回 ExpandoObject?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9685277/

10-10 22:55