Frage

Ich habe eine Klasse mit dem Namen A und eine Klasse B

public class A : UserControl { }

public class B : UserControl { }

Jetzt habe ich eine Baugruppe, deren Klasse Funktion Objekte der Klasse A. akzeptiert Diese Versammlung nicht von mir erstellt wird, so dass ich keine Kontrolle haben. Im Grunde ist es 3rd-Party-Montag.

Aber ich möchte, dass meine Objekte der Klasse B liefern, da es wenig angepasst ist. Seien Sie versichert, es werden alle Eigenschaften der Klasse A enthält Wie kann ich meine Typumwandlung Objekt der Klasse B A zu geben, so dass ich 3rd-Party-Versammlung in meinem Projekt integrieren sowie das Aussehen anpassen und das Gefühl nach meinen Bedürfnissen?

Wenn ich so etwas wie (A)objB ist es nicht erlaubt. Dann habe ich versucht, dies:

UserControl control = objB as UserControl;

A objA = control as A;

Aber Problem ist in diesem Fall objA ist null.

Um Verwirrung zu vermeiden: Klasse A und Montag wird von 3rd-Party zur Verfügung gestellt.

Vielen Dank im Voraus:)

War es hilfreich?

Lösung

In Anbetracht der Hierarchie erhalten Sie einen Konvertierungsoperator zu schreiben. Es gibt keine eingebaute Möglichkeit, dies im Allgemeinen zu tun (man denke Dog : Animal und Cat : Animal):

public static explicit operator A(B b) {
    // code to populate a new instance of A from b
}

Sie können auch eine allgemeine Reflexion Framework verwenden und so etwas wie

public static void PropertyCopyTo<TSource, TDesination>(
    this TSource source,
    TDestination destination
) {
    // details elided
}

so ist, dann könnte man sagen,

// b is B
// a is A
b.PropertyCopyTo<A>(a);

, die alle gemeinsamen Eigenschaften zwischen b zu a kopieren würde.

Andere Tipps

Für B sein gießbaren zu einem A, B Muss inherits A. Selbst wenn B alle Eigenschaften von A enthält, ist es noch kein A.

Sie können einen Adapter Muster verwenden

Here

Wenn B nicht auf A gegossen werden (wie in B is A) es ist nicht möglich, zu erreichen, was Sie versuchen, ohne von A. vererben zu tun Leider C # nicht Duck Typing unterstützt im Gegensatz zu vielen dynamischen Sprachen (zB Rubin).

Sie können von Klasse A erben:

public class B : A {
}

Und wenn Sie einige Methoden overrride benötigen / Eigenschaften, die sie nur auf virtual in der Klasse A.

Ich glaube, Sie eigentlich kann es nicht tun.

Warum Ihre Eigenschaften auf eine Teilklasse A nicht hinzufügen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top