2012-03-13 69 views
3

我想从一个WebMethod返回ExpandoObject,像这样:是否可以从Web服务调用中返回ExpandoObject?

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

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

    DynamicallyAddMoreFields(item); 

    return item; 
} 

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

To be XML serializable, types which inherit from IEnumerable must have an implementation of Add(System.Object)

我不能延长ExpandoObject因为它是封闭的。

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

+0

如果某个java客户端想要使用您的方法,那么怎么办?你应该总是返回众所周知的类型。 - EDIT:Webservice是客户端和服务器之间的契约。这里的合同是什么,你返回给客户的是什么?一个可以包含任何东西的ExpandoObject。 – 2012-03-13 14:16:44

+0

@ L.B在这种特殊情况下,它不是一个问题,因为客户端将读取结果XML,它将始终具有基于已知参数的相同结构,并且此WS仅供公司内部使用。 – Meryovi 2012-03-13 14:59:00

回答

7

您可以通过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任何序列化格式。

+0

谢谢!完美的作品! – Meryovi 2012-03-13 15:01:43