2013-08-13 2 views
5

Ho un qualcosa di dichiarazione come questa: MyClass myClass = report.DataSource as MyClassCome eseguire il cast su un oggetto per un tipo quando il tipo è noto durante il runtime?

Durante il runtime, il tipo di DataSource è MyClass ma è in uno spazio dei nomi diverso rispetto al progetto in corso in corso. Questo perché due progetti stanno creando le stesse classi dallo stesso riferimento di servizio. DataSource punta a uno spazio dei nomi e il cast MyClass proviene da una diversa namesapce. (è complicato spiegare come si è verificato)

Durante il runtime, come utilizzare il tipo restituito da report.DataSource.GetType() (restituisce MyClass da un altro spazio dei nomi) e utilizzarlo come tipo cast invece di "MyClass" che è nel namespace che non voglio?

(spero che ho spiegato in modo chiaro. Il mio cervello è nebbia ora!)

+2

se si estrae la definizione MyClass in un assembly separato condiviso dal servizio e dai client, il generatore di riferimento del servizio riutilizzerà la classe esistente e renderà le cose molto più semplici per voi. –

+1

Potresti usare i farmaci generici? – TylerOhlsen

+0

+1 Michael - Stavo scrivendo mentre stavi commentando! – lesscode

risposta

0

Provare a implementare il mio convertitore di tipi o utilizzare uno strumento esterno come l'automapper per un problema una tantum era troppo lavoro. Ho deciso di copiare tutti i dati da un tipo all'altro. Ho usato il javascriptserializer per ottenere solo lo schema e i dati senza spazi dei nomi. Ha funzionato magnificamente in 5 linee di codice.

2

Purtroppo, non è solo che la sua la "stessa classe in uno spazio diverso" ... in fondo, si dispone di 2 classi . Sono classi completamente diverse, a causa del codice generato automaticamente.

Per quanto riguarda il Runtime .Net, potrebbero anche essere diversi come "int" e "stringa". Probabilmente arrivano da diverse assemblee.

Ho avuto anche un problema simile - e a questo punto, probabilmente la cosa più semplice che puoi fare è creare il tuo metodo di conversione generico che leggerà le proprietà pubbliche da un tipo e le popolerà sull'altro genere.

questo può essere fatto perché si PROMESSA che le due classi appaiono identici :)

+2

Cerca in [AutoMapper] (https://github.com/AutoMapper/AutoMapper) se vuoi qualcosa che aiuti a eseguire la conversione, specialmente se hai molte di queste classi da trasferire. –

0

In sostanza ciò che si vuole è chiamato "duck typing". È possibile farlo utilizzando Castle DynamicProxy e trovare un ottimo esempio here.

0

Non sono sicuro di aver capito chiaramente il vostro problema, ma qui va

Non collocare using dichiarazioni a quelle classi nella parte superiore del file di classe - in questo modo avrete sempre loro riferimento utilizzando la piena namespace .

Successivamente E 'abbastanza facile, per quanto ho capito

MyClass myClass = report.DataSource as MyClass 
if(myClass==null) 
    //do the second conversion 

Se lo spazio dei nomi totalmente (o parzialmente) collide utilizzare una delle parole chiave di due

  1. global:: quando si fa riferimento alla classe
  2. extern alias in uno o entrambi i gruppi che hanno MyClass

Se si desidera convertire una classe in un'altra, implementare il convertitore personalizzato.

1

Se ho compreso correttamente la tua domanda, hai due progetti che fanno riferimento allo stesso servizio (Aggiungi riferimento servizio allo stesso endpoint). Questo servizio restituisce un oggetto DataContract. Hai anche uno di quei progetti che fanno riferimento all'altro e che utilizzano il proxy generato dall'altro progetto per il DataContract del servizio.

Come altri hanno sottolineato, per impostazione predefinita i tipi di proxy generati per DataContract rappresenteranno due tipi distinti e incompatibili.

Tuttavia, se si è in grado di assumere .NET sia sul client che sul server, è possibile definire il tipo DataContract nel proprio assembly a cui fanno riferimento tutti e tre gli altri progetti: la libreria di servizi ei due progetti client . Normalmente è buona pratica farlo comunque.

Quindi è possibile configurare la generazione del proxy client (Aggiungi riferimento servizio -> Avanzate) per riutilizzare i tipi nell'assieme comune.

Ora ci sarà un solo tipo per DataContract condiviso dai due progetti client.

0

Potrebbe non essere adatto al tuo scopo, ma per essere completo, cito l'opzione in fase di compilazione a tua disposizione: Interfacce.

Se si crea un'interfaccia in un assembly che CAN venga condivisa in fase di compilazione, è possibile eseguire il cast su tale interfaccia in qualsiasi momento.