try - cast<> c#
Lanzar un objeto a otro tipo (6)
Tengo una clase llamada A y una clase B
public class A : UserControl { }
public class B : UserControl { }
Ahora tengo un ensamblaje cuya función de clase acepta objetos de clase A. Este ensamblaje no es creado por mí, así que no tengo ningún control. Básicamente es un ensamble de terceros.
Pero quiero suministrar mis objetos de clase B, ya que es un poco personalizado. Tenga la seguridad de que contiene todas las propiedades de la clase A. ¿Cómo puedo encasillar mi objeto de la clase B en el tipo A para integrar el ensamblaje de terceros en mi proyecto y personalizar el diseño según mis necesidades?
Si algo como (A)objB
no está permitido. Entonces intenté esto:
UserControl control = objB as UserControl;
A objA = control as A;
Pero el problema en este caso es que objA es nulo.
Para evitar confusiones: la clase A y el montaje son proporcionados por una tercera parte.
Gracias por adelantado :)
Creo que en realidad no puedes hacerlo.
¿Por qué no agregar sus propiedades a una clase parcial A?
Dada su jerarquía, tendrá que escribir un operador de conversión. No hay una manera incorporada de hacer esto en general (piense en Dog : Animal
y Cat : Animal
):
public static explicit operator A(B b) {
// code to populate a new instance of A from b
}
También podría usar un marco de reflexión genérico y hacer algo como
public static void PropertyCopyTo<TSource, TDesination>(
this TSource source,
TDestination destination
) {
// details elided
}
Entonces podrías decir
// b is B
// a is A
b.PropertyCopyTo<A>(a);
que copiaría todas las propiedades comunes entre b
a a
.
Para que B
sea moldeable a A
, B
debe heredar A
Incluso si B
contiene todas las propiedades de A
, todavía no es una A
Puedes heredar de la clase A:
public class B : A {
}
Y si necesita anular algunos métodos / propiedades, simplemente configúrelos como virtual
en la clase A.
Si B no se puede convertir a A (como en B is A
), no es posible lograr lo que está tratando de hacer sin heredar de A. Desafortunadamente, C # no es compatible con el tipado de pato a diferencia de muchos lenguajes dinámicos (es decir, Ruby).
puede usar un patrón de Adaptador