Pregunta

Tengo una clase llamada A y una clase B

public class A : UserControl { }

public class B : UserControl { }

Ahora tengo un conjunto cuya función de la clase acepta objetos de la clase A. Este conjunto no es creada por mí, así que no tengo ningún control. Básicamente se trata de 3 ª parte de montaje.

Pero quiero proveer a mis objetos de la clase B, ya que se adapta poco. Tenga la seguridad de que contiene todas las propiedades de la clase A. ¿Cómo puedo encasillado mi objeto de la clase B a tipo A de modo que pueda integrar la tercera parte de montaje en mi proyecto, así como personalizar la apariencia de acuerdo a mis necesidades?

Si i así que algo como (A)objB no está permitido. Luego he intentado esto:

UserControl control = objB as UserControl;

A objA = control as A;

Pero el problema en este caso es objA es nulo.

Para evitar confusiones: la clase A y el montaje se proporciona por tercera parte.

Gracias de antemano:)

¿Fue útil?

Solución

Dada su jerarquía, tendrá que escribir un operador de conversión. No hay que lleva incorporado manera de hacer esto en general (y pensar Dog : Animal Cat : Animal):

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

También podría utilizar un marco de reflexión genérica y hacer algo como

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

por lo que entonces se podría decir

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

que copiar todas las propiedades comunes entre b a a.

Otros consejos

Para B a ser convertible a un A, B obligada hereda A. Incluso si B contiene todas las propiedades de A, todavía no es un A.

se puede utilizar un patrón de adaptador

ve aquí

Si B no se puede convertir a A (como en B is A) no es posible de lograr lo que estamos tratando de hacer sin heredar de A. Por desgracia C # no soporta pato a escribir a diferencia de muchos lenguajes dinámicos (es decir rubí).

Se puede heredar de la clase A:

public class B : A {
}

Y si necesita overrride algunos métodos / propiedades sólo les ponen a virtual en la clase A.

Creo que realmente no puede hacerlo.

¿Por qué no añadir sus propiedades a una clase Un parcial?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top