Альтернатива использования встроенного объекта, который реализует IDictionary для веб-метода - PullRequest
2 голосов
/ 16 мая 2009

У меня есть веб-приложение, которое использует веб-службу, созданную в ASP.NET. В этом веб-сервисе я хочу передать объект коллекции типа Key Value (то есть что-то вроде Hashtable или Dictionay).

Но мы не можем использовать объекты, которые реализуются из IDictionary.

Я не хочу создавать сериализованный класс в своем веб-сервисе.

Кто-нибудь может предложить мне лучший подход для этого?

Ответы [ 5 ]

3 голосов
/ 16 мая 2009

dev.e.loper почти прав. Вы можете использовать List<Pair>.

В качестве альтернативы вы можете использовать List<KeyValuePair<TKey,TValue>>.

Документация MSDN:

1 голос
/ 24 марта 2011

Я решил это с помощью DictionaryEntry

Единственное отличие состоит в том, что Key также является Object.

В основном у меня есть статические методы Dictionary ToDictionary(DictionaryEntry[] entries) и DictionaryEntry[] FromDictionary(Dictionary entries), которые очень легки и в итоге приводят меня в одно и то же место без необходимости создавать собственный класс коллекции.

Дополнительным преимуществом является то, что полученный в результате XML ближе к тому, в котором веб-службы WCF используют по умолчанию! Это означает, что вы можете сделать это изменение в своем клиентском коде и быть готовым к WCF, если вы решите пойти этим путем.

Результат выглядит так в JSON [{"Key": key1, "Value": value1}, {"Key": key2, "Value": value2}] точно так же, как в WCF по умолчанию.

1 голос
/ 18 марта 2010

Вы можете наследовать от KeyedCollection, которая является Сериализуемой.

http://msdn.microsoft.com/en-us/library/ms132438.aspx

1 голос
/ 16 мая 2009

Мне не совсем понятен ваш вопрос, но, может быть, вам нужно что-то подобное?

using System.Collections.Generic;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

[XmlRoot("dictionary")]
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
{
    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        var keySerializer = new XmlSerializer(typeof(TKey));
        var valueSerializer = new XmlSerializer(typeof(TValue));

        bool wasEmpty = reader.IsEmptyElement;
        reader.Read();

        if (wasEmpty)
        {
            return;
        }

        while (reader.NodeType != XmlNodeType.EndElement)
        {
            reader.ReadStartElement("item");

            reader.ReadStartElement("key");
            var key = (TKey)keySerializer.Deserialize(reader);
            reader.ReadEndElement();

            reader.ReadStartElement("value");
            var value = (TValue)valueSerializer.Deserialize(reader);
            reader.ReadEndElement();

            this.Add(key, value);
            reader.ReadEndElement();
            reader.MoveToContent();
        }

        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        var keySerializer = new XmlSerializer(typeof(TKey));
        var valueSerializer = new XmlSerializer(typeof(TValue));

        foreach (var key in this.Keys)
        {
            writer.WriteStartElement("item");
            writer.WriteStartElement("key");
            keySerializer.Serialize(writer, key);
            writer.WriteEndElement();
            writer.WriteStartElement("value");
            TValue value = this[key];
            valueSerializer.Serialize(writer, value);
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
    }
}
0 голосов
/ 16 мая 2009

Вы можете попробовать использовать 2 массива, 1 для ключей и один для значений, где индексы массивов совпадают. Не самое идеальное решение, но правильное. Внутренние части веб-службы, вы можете использовать IDictionary и просто передать ключи и значения этого объекта.

...