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 :)

È stato utile?

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

Vedi qui

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top