Можно ли вернуть ExpandoObject из вызова веб-службы? - PullRequest
3 голосов
/ 13 марта 2012

Я хотел бы вернуть ExpandoObject из WebMethod, например:

[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, так как он запечатан.

Возможно ли этосделать это другим способом?

1 Ответ

8 голосов
/ 13 марта 2012

Вы можете создать свою собственную сериализуемую версию класса 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 .

...