Pregunta

Tengo dos objetos. Objeto a y objeto B.

El objeto A es una instancia de una clase que se generó a partir de varios archivos XSD. Usó xsd.exe /c y los compiló. Ahora tengo mi nuevo objeto.

También tengo un servicio web, que devuelve algo muy similar al objeto A. Así que en este momento tengo algo parecido a esto:

WebService.foo myResponseObj = MyService.GetObject(inData);
MyFramework.foo myClientObj = new MyFramework.foo();

Lo que quiero hacer es esto

myClientObj = (MyFramework.foo)myResponseObj

Sin embargo, realmente no le gusta esto. Dice "No se puede convertir implícitamente myframework.foo [] a WebService.foo [

¿Alguna idea de como resolver esto? El objeto es bastante grande y son básicamente idénticos.

¿Fue útil?

Solución

¿Qué tal extraer la interfaz (haga clic derecho en una clase, seleccione Refactor-> Extraer interfaz) y aplique esta interfaz a ambas clases?

Entonces se verá algo así como:

namespace WebService
{
   public class foo : IExtractedInterface
}

y

namespace MyFramework
{
   public class foo : IExtractedInterface
}

Entonces deberías poder hacer:

IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj;

Otros consejos

Ambos objetos tendrían que heredar de la misma interfaz para realizar con éxito el elenco que ha especificado. Puede considerar extraer los métodos comunes que necesita en una interfaz que se pueda implementar en ambas clases, de esa manera puede lanzar al tipo de interfaz y luego tener acceso a esos métodos en lugar de todo el objeto.

¡Disfrutar!

Debe hacer un método que convierta una clase en la otra copiando manualmente todas las propiedades.

Entonces puedes llamar a ese método en Array.ConvertAll.

Ser "básicamente idéntico" es insuficiente. Solo puede lanzar entre dos objetos si son compatibles con el tipo, lo que significa que comparten un descendiente común y que los tipos reales son válidos para el lanzamiento.

Por ejemplo, lo siguiente funciona si Circle es un descendiente de Shape:

Shape x = new Circle();
Circle y = (Circle)x;

Sin embargo, lo siguiente no Evento laboral si ClassA y ClassB tienen exactamente los mismos campos pero en realidad no descienden entre sí:

ClassA a = new ClassA();
ClassB b = (ClassA)a;

Puede valer la pena hacer que ambos implementen una interfaz común, entonces podría lanzar a esa interfaz y usarlos como desee.

Esto ha sido básicamente ya respondió. Tenga en cuenta, sin embargo, que, además de lo que se ha respondido aquí, hay un pequeño destello de esperanza proporcionado por la nueva función de "tipo de equivalencia de tipo de tipo de .NET 4:

Sin embargo, tenga en cuenta que C# 4 admitirá una forma limitada de tipificación estructural en las interfaces. Ver http://blogs.msdn.com/samng/archive/2010/01/24/the-pain-ofdeploying-prrimary-interop-assemblies.aspx para detalles.

Sin embargo, esto es bastante avanzado .net-Foo.

Si está utilizando la herramienta WSDL.exe estándar para crear su proxy y clases de soporte, entonces creo que genera el código como clases parciales. Si esa es su situación, entonces puede insertar su propio operador de conversión implícito en uno de los tipos. Por ejemplo, supongamos que tiene su clase myservice.foo definida en el archivo "myService foo.cs" como se muestra a continuación:

namespace MyService
{
    public partial class foo
    {
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string PropertyC { get; set; }
        // ...
    }
}

Y tienes tu clase myframework.foo definida en el archivo "myframework foo.cs" como se muestra a continuación:

namespace MyFramework
{
    public class foo
    {
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string PropertyC { get; set; }
        // ...
    }
}

Luego puede crear un archivo separado, digamos "myService foo.conversion.cs" como se muestra a continuación:

namespace MyService
{
    partial class foo
    {
        public static implicit operator MyFramework.foo(foo input)
        {
            return new MyFramework.foo
            {
                PropertyA = input.PropertyA,
                PropertyB = input.PropertyB,
                PropertyC = input.PropertyC,
                // ...
            };
        }
    }
}

Y eso le permitiría escribir la mayor parte de su código usando un objeto myservice.foo como si fuera un objeto myframework.foo. El siguiente código se compila con la configuración anterior:

        MyService.foo x = new MyService.foo();

        MyFramework.foo y = x;

Si es una matriz, que sugiere la cita que dio, entonces debe iterar a través de la colección de respuesta y agregar los objetos de los miembros a la colección del cliente.

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