Posso evitare di usare tipi di variabili che ignorano il controllo del tipo quando si utilizza una libreria che fornisce modelli in gran parte identici ma non correlati?

1

Ho una situazione in cui sto usando una libreria che è stata generata per fornire un'interfaccia XML in C # basata su un file XSD eseguito attraverso xsd.exe .

L'XML è strutturato in questo modo.

-Results
    -ModelA
    -ModelB
    -ModelC
    -ModelD

Quando in realtà sto lavorando con questo XML (che è mappato in oggetti di memoria interna grazie alla libreria) ho un sacco di codice che si applica a tutti i modelli. Ad esempio, potrei sapere che posso cercare un campo chiamato FinalResult in tutti e quattro i modelli.

Se avessi il controllo sulle classi che rappresentano i modelli, potrei refactoring in modo che avrebbe più senso, ma il codice che viene generato tratta questi quattro modelli come entità separate, e il genitore è solo un genitore nel senso che ha variabili che indicano i suoi "figli", non in senso OOP.

Per quanto posso dire, questo significa che potrei usare qualcosa come la parola chiave dynamic in C # ed evitare la duplicazione del codice, o riscrivere il codice più volte per avere sicurezza del tipo, essendo obbligato a farlo dal fatto che io avere il controllo sulla libreria esterna.

    
posta Geesh_SO 02.03.2018 - 16:30
fonte

1 risposta

1

Sì, puoi.

La parola chiave dynamic in C # consente di fare riferimento solo a quei membri dell'oggetto che sono rilevanti per te. Puoi fare riferimento ai membri comuni a tutti i tuoi tipi e trattare gli oggetti allo stesso modo:

foreach (dynamic result in Results)
{
    list.Add(result.FinalResult);
}

Finché non ti preoccupi dell'assenza di intellisense, funzionerà proprio come se avessi usato un oggetto strongmente tipizzato. L'unica differenza è che l'associazione del membro (e del controllo del tipo) avverrà in fase di esecuzione anziché in fase di compilazione.

Nell'esempio sopra, fintanto che FinalResult ha lo stesso tipo in tutti i tuoi oggetti, la lista non conoscerà mai la differenza.

Si noti che si potrebbe fare la stessa cosa senza dynamic , ma richiederebbe che le classi dei risultati ereditassero da un Interface contenente i membri comuni:

foreach (IResult result in Results)
{
    list.Add(result.FinalResult);
}
    
risposta data 02.03.2018 - 16:43
fonte

Leggi altre domande sui tag