2009-05-16 3 views
2

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

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

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

Может ли кто-нибудь предложить мне лучший подход для этого?Альтернатива использования встроенного объекта, который реализует IDictionary для веб-метода

+2

Почему вы не можете использовать словари и почему бы вам целенаправленно избегать написания сериализованного класса? – Juliet

+0

Вы не можете использовать тип, который наследуется от IDictionary, как возвращаемый тип веб-метода – Vnuk

ответ

0

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

3

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

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

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

1

Я не совсем ясно, на ваш вопрос, но, возможно, вы нуждаясь что-то вроде этого?

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(); 
     } 
    } 
} 
1

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

Единственное отличие состоит в том, что ключ является объектом, а также.

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

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

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