2015-07-07 13 views
5

Abbiamo creato la struttura Id32 e Id64 per includere interi e valori lunghi provenienti da DB, in modo che possano essere esplicitamente elaborati come ID da un convertitore Json (con convertitori personalizzati dedicati).Cast implicito di runtime dall'oggetto

Il problema è che si legge questi dati da un Dictionary<string, object> che in realtà è un oggetto DataRow -come dove la parte string è il nome della colonna e la parte object è il valore.

Così prima abbiamo avuto questo codice per leggere il valore:

int myVal = (int)row["COLUMN"] 

vogliamo che questo codice per continuare a lavorare anche dopo queste modifiche.

Ma poiché row["COLUMN"] è un object (@ tempo di compilazione) il cast implicito ha esito negativo, anche se in realtà è un Id32 (@ run-time).

le seguenti opere, ovviamente:

int myVal = (Id32)row["COLUMN"] 

ma c'è un po 'a modo per risolvere questo senza modificare il codice che legge il valore?

Questo è il codice struct:

public struct Id32 
{ 
    public readonly int Value; 

    public Id32(int id) { this.Value = id; } 

    public static implicit operator int(Id32 id) { return id.Value; } 

    public static implicit operator Id32(int id) { return new Id32(id); } 
} 
+0

Vedere anche: http://stackoverflow.com/questions/1611083/will-the-c-sharp-compiler-perform-multiple-implicit-conversions-to-get-from-one –

+0

Questa domanda riguarda le conversioni implicite non cast. Sebbene il cast sia coinvolto (hai un 'object' e deve essere lanciato su' int', possibilmente all'interno di una conversione implicita da 'object' definito su' Id32'). – binki

risposta

2

A mio parere non è una soluzione molto discreta, ma funziona (spero non ci sono soluzioni migliori): se si utilizza dynamic tipo sottostante è determinato in fase di esecuzione , quindi funzionerà il controllo del tipo con il cast implicito.

Il codice che ho usato:

dynamic o = new Id32(1); 
// dynamic o = row["COLUMN"]; in your case 

int myVal = (int)o; 

Se si cambia dynamic-object avrete la vostra situazione attuale, che non riesce.

+1

Questo è davvero interessante. Ma non so davvero se sia possibile dichiarare un 'Dictionary ' ... Farò un tentativo. – Teejay

+0

No, ma è già stato convertito in quel momento (se lo fai prima di aggiungere al dizionario), quindi non importa. –

+0

Sfortunatamente, in questo modo, dobbiamo modificare il codice per leggere comunque il valore. – Teejay

3

Penso che questo non sia possibile con il vincolo di non modificare il tuo di recupero del codiceint myVal = (int)row["COLUMN"].

È necessario aggiungere un cast implicito a object (a int) che non può essere eseguito. Ci sono molti modi per rendere il tuo cast semplice ma a chiunque riesca a pensare o troverai come here per cambiare quella linea.

Anche se non lo cambierai, suppongo che dovrai ricompilarlo - quindi se lo ricompilai, perché non lo cambi? Esistono alcuni strumenti di refactoring che dovrebbero rendere abbastanza facili anche migliaia di righe.

+0

Grazie per il tuo contributo. – Teejay