我想从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类,因为它是密封的。
是否有可能以其他方式做到这一点?
答案 0 :(得分:8)
您可以通过继承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。