Dato il grande successo della seria Whidbey Watcher di Corrado e Andrea, eccomi qui anche io a parlare del mondo dei web services in versione Whidbey.

Quante volte avremmo voluto serializzare nella risposta SOAP una Hastable ? Non so voi, ma io tante volte. Ora, data la limitazione della versione 1.1 di ASP.NET, non potevo esimermi di andare a verificare se era finalmente possibile farlo nella prossima versione (2.0). Forte del fatto che le dichiarazioni pubbliche lo danno come possibile, mi sono lanciato nella fatidica prova e voilà, ecco il risultato:

The type System.Collections.Hashtable is not supported because it implements IDictionary.

Bene, dato che questa via non funziona ancora (!!??!!!??), allora provo la via dei generics. Provo la classe KeyedCollection ma stranamente il compilatore dice che non è possibile istanziare una classe astratta (peccato che la documentazione dice che non è astratta). Ok, alternative ? Crearmi la mia Hashtable:

[XmlType("Hashtable")]
public class MyHashtable
{
    [XmlElement("Items")]
    public List> Items;

    public MyHashtable()
    {
        Items = new List>();
    }

    public void Add(Guid key, int value)
    {
        Items.Add(new MyHashtableItem(key, value));
    }
}

[XmlType("Item")]
public struct MyHashtableItem
{
    [XmlAttribute("Key")]
    public T Key;

    [XmlAttribute("Value")]
    public U Value;

    public MyHashtableItem(T key, U value)
    {
        Key = key;
        Value = value;
    }
}

e quindi usarla nel proprio web method:

[WebMethod]
public MyHashtable GetNumbers()
{
    MyHashtable list = new MyHashtable();
    list.Add(Guid.NewGuid(), 21);

    return list;
}

Si può fare di meglio ? Sicuramente si, ma a questo punto attendiamo la beta 1 :-)