Trasmettere un oggetto a un altro tipo
-
27-09-2019 - |
Domanda
Ho una classe denominata A e una classe B
public class A : UserControl { }
public class B : UserControl { }
Ora ho un assembly la cui funzione di classe accetta oggetti di classe A.Questo assembly non è stato creato da me, quindi non ho alcun controllo.Fondamentalmente si tratta di un'assemblea di terze parti.
Ma voglio fornire i miei oggetti di classe B poiché è un po' personalizzato.Stai certo che contiene tutte le proprietà della classe A.Come posso digitare il mio oggetto di classe B nel tipo A in modo da poter integrare un assemblaggio di terze parti nel mio progetto e personalizzare l'aspetto in base alle mie esigenze?
Se è così, qualcosa del genere (A)objB
non è permesso.Poi ho provato questo:
UserControl control = objB as UserControl;
A objA = control as A;
Ma il problema in questo caso è che objA è nullo.
Evitare la confusione:classe A e l'assemblaggio è fornito da terze parti.
Grazie in anticipo :)
Soluzione
Data la gerarchia, si dovrà scrivere un operatore di conversione. Non v'è alcun built-in modo per fare questo in generale (si pensi Dog : Animal
e Cat : Animal
):
public static explicit operator A(B b) {
// code to populate a new instance of A from b
}
Si potrebbe anche usare un quadro di riflessione generica e fare qualcosa di simile
public static void PropertyCopyTo<TSource, TDesination>(
this TSource source,
TDestination destination
) {
// details elided
}
così allora si potrebbe dire
// b is B
// a is A
b.PropertyCopyTo<A>(a);
che copiare tutte le proprietà comuni tra b
a a
.
Altri suggerimenti
Per B
essere lanciabile a a A
, B
dovere eredita A
.Anche se B
contiene tutte le proprietà di A
, non è ancora un A
.
È possibile utilizzare un modello di adattatore
Se B non può essere lanciato ad A (come in B is A
)
non è possibile ottenere ciò che si sta cercando di fare a meno di ereditare da A. Purtroppo C # non supporta duck typing a differenza di molti linguaggi dinamici (ad esempio Ruby).
Si può ereditare dalla classe A:
public class B : A {
}
E se avete bisogno di overrride alcuni metodi / proprietà semplicemente impostate per virtual
in classe A.
Credo che in realtà non può fare.
Perché non aggiungere i tuoi oggetti da una classe parziale A?