lo que pide es imposible por dos razones:
ItemA.GetType()
no devuelve el tipo en tiempo de compilación de la variable ItemA
- se devuelve el tipo en tiempo de ejecución del objeto refiere por ItemA
.
- No se puede hacer que
(A)B
produzca una conversión de cambio de representación (es decir, un nuevo objeto A
) porque los operadores de conversión definidos por el usuario (su única esperanza aquí) no pueden convertir de clases derivadas a clases base. Obtendrá una conversión de referencia normal y segura.
Aparte de eso, lo que usted pide es muy extraño; uno pensaría que está tratando realmente de violar el principio de substiución de Liskov. Es casi seguro que hay un problema grave de diseño que debe abordar.
Si aún desea hacer esto; puede escribir un método que construya manualmente un A
desde un B
al actualizar un A
y luego copiar los datos. Esto podría existir como un ToA()
instancia-método en B
.
Si caracterizado a este problema como "? ¿Cómo construyo un A partir de una existentes Un", que tiene mucho más sentido: crear un constructor de copia en A
, cuya declaración se parece a public A(A a){...}
, que es agnóstico a detalles específicos de subclase. Esto le proporciona un medio general para crear un A
a partir de una instancia existente de A
o una de sus subclases.
Agregando a la respuesta sobre por qué no puede hacer esto, no debería tener que hacerlo. Cuando desee saber si un objeto pertenece a un tipo de la clase base, no tiene que verificar la equidad de los tipos de tiempo de ejecución, pero puede usar funciones como 'is' o' IsAssignableFrom'. –
¿Qué produce ItemA.GetType(). FullName? 'Namespace.B'? –
Sí, en ese momento, el ItemA es un B. Lo que realmente estoy tratando de evitar es un problema de WCF que requiere tipos exactos. Sé que podría usar KnownTypes, pero preferiría no hacerlo si es posible. – Telavian