2009-03-11 5 views
5

Ho una classe astratta 'Server', che creo nel mio JavaScript nel mio UI e poi voglio avere un metodo sul mio servizio Web che esegue le seguenti operazioni:Deserialize classe astratta

public List<Database> GetDatabases(Server server) 
{ 
    Type type = server.GetType(); 
    Server x = null; 

    if (typeof (SqlServer2005Server).Equals(type)) 
    { 
     x = new SqlServer2005Server(); 
    } 

    // Return the Databases from the server 
    return x.GetDatabases(); 
} 

Il problema che ho sto avendo è che Server non può essere deserializzato come è astratto, non ho bisogno di avere un metodo per ogni server che ho, che eredita dal tipo cioè di cemento

public List<Database> GetDatabases(SqlServer2005Server server) 
{ 
    // Return the Databases from the server 
    return SqlServer2005Serverx.GetDatabases(); 
} 

public List<Database> GetDatabases(OracleServer server) 
{ 
    // Return the Databases from the server 
    return SqlServer2005Serverx.GetDatabases(); 
} 

Vorrei davvero apprezzare il vostro aiuto come io non sono sicuro qual è la soluzione migliore

L'errore esatto che ricevo è: non è possibile creare

istanze di classi astratte.

risposta

9

WCF supporterà l'ereditarietà, ma è necessario decorare il contratto dati con il tipo noto attibute. Ad esempio:

[DataContract] 
[KnownType(typeof(Customer))] 
class Contact 
{ 
    [DataMember] 
    public string FirstName 
    {get;set;} 

    [DataMember] 
    public string LastName 
    {get;set;} 
} 
[DataContract] 
class Customer : Contact 
{ 
    [DataMember] 
    public int OrderNumber 
    {get;set;} 
} 

HTH.

+0

Grazie per la tua risposta, posso aggiungere diversi KnowTypes. cioè [DataContract] [KnownType (typeof (Cliente))] [KnownType (typeof (Employee))] [KnownType (typeof (Alien))] class Contattare { ... molto apprezzato Phill –

+0

Funzionerà anche con le classi astratte, posso vedere nel tuo esempio che è una classe normale? Grazie ancora, Phill –

+0

Ciao Phil, se vuoi, puoi aggiungere tutti gli attributi di KnownType di cui hai bisogno. Tutto dipende dalla profondità della catena ereditaria. HTH. In bocca al lupo. – stephenl