Frage

Ich habe zwei Objekte. Objekt A und Objekt B.

Objekt A ist eine Instanz einer Klasse, die aus mehreren XSD -Dateien generiert wurde. Verwendet xsd.exe /c und kompilierte sie. Jetzt habe ich mein neues Objekt.

Ich habe auch einen Webdienst, der etwas sehr ähnliches wie Objekt A zurückgibt. Im Moment habe ich etwas in diesem Sinne:

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

Was ich tun möchte, ist das

myClientObj = (MyFramework.foo)myResponseObj

Das mag das jedoch nicht wirklich. Sagt "kann MyFramework.foo [] nicht implizit in WebService.foo [] konvertieren.

Irgendwelche Ideen, wie man dies behebt? Das Objekt ist ziemlich groß und sie sind im Grunde identisch.

War es hilfreich?

Lösung

Wie wäre es mit dem Extrahieren der Schnittstelle (mit der rechten Maustaste auf eine Klasse klicken, Refactor-> Schnittstelle extrahieren) und diese Schnittstelle auf beide Klassen anwenden?

So wird es so aussehen wie:

namespace WebService
{
   public class foo : IExtractedInterface
}

und

namespace MyFramework
{
   public class foo : IExtractedInterface
}

Sie sollten dann in der Lage sein:

IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj;

Andere Tipps

Beide Objekte müssten von derselben Schnittstelle erben, um die von Ihnen angegebene Besetzung erfolgreich durchzuführen. Sie können sich ansehen, wie Sie die gemeinsamen Methoden (en) in eine Schnittstelle benötigen, die in beiden Klassen implementiert werden kann. Auf diese Weise können Sie einfach an den Schnittstellentyp gegossen und dann auf diese Methoden und nicht auf das gesamte Objekt zugreifen.

Genießen!

Sie müssen eine Methode erstellen, die eine Klasse in die andere umwandelt, indem Sie alle Eigenschaften manuell kopieren.

Sie können diese Methode dann aufrufen Array.ConvertAll.

Sie sind "im Grunde genommen identisch". Sie können nur zwischen zwei Objekten gegossen, wenn sie Typenkompatibel sind, was bedeutet, dass sie einen gemeinsamen Nachkommen teilen und die tatsächlichen Typen für das Gießen gültig sind.

Zum Beispiel funktioniert das folgende, wenn Circle ist ein Nachkomme von Shape:

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

Das Folgende wird jedoch nicht Arbeitsereignis, wenn ClassA und ClassB Haben Sie genau die gleichen Felder, sind aber nicht tatsächlich voneinander abstammen:

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

Es kann sich lohnen, sie beide eine gemeinsame Schnittstelle zu implementieren, dann können Sie diese Schnittstelle werfen und sie so verwenden, wie Sie es möchten.

Dies war im Grunde genommen bereits beantwortet. Beachten Sie jedoch, dass zusätzlich zu dem, was hier beantwortet wurde, einen kleinen Hoffnungsschimmer von .NET 4s neuer "Typ" Equivalenz "-Funktion bereitstellt:

Beachten Sie jedoch, dass C# 4 eine begrenzte Form der strukturellen Typisierung auf Schnittstellen unterstützen wird. Sehen http://blogs.msdn.com/samng/archive/2010/01/24/the-pain-of-deploying-primary-interop-assemblies.aspx für Details.

Dies ist jedoch ziemlich fortgeschritten .Net-Foo.

Wenn Sie das Standard -WSDL.exe -Tool verwenden, um Ihren Proxy und Unterstützungsklassen zu erstellen, glaube ich, dass er den Code als Teilklassen generiert. Wenn dies Ihre Situation ist, können Sie Ihren eigenen impliziten Conversion -Operator in einen der Typen einfügen. Angenommen, Sie haben beispielsweise Ihre MyService.foo -Klasse in der Datei "myService foo.cs" wie unten definiert:

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

Und Sie haben Ihre MyFramework.foo -Klasse in der Datei "MyFramework foo.cs" wie unten definiert:

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

Dann können Sie eine separate Datei erstellen. Sagen wir "myService foo.conversion.cs" wie unten:

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,
                // ...
            };
        }
    }
}

Und so würde Sie den größten Teil Ihres Codes mit einem myService.foo -Objekt schreiben, als wäre es ein MyFramework.foo -Objekt. Der folgende Code erstellt mit dem obigen Setup:

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

        MyFramework.foo y = x;

Wenn es sich um ein Array handelt, das das von Ihnen angegebene Zitat vorschlägt, müssen Sie durch die Antwortsammlung iterieren und die Mitgliedsobjekte in die Client -Sammlung hinzufügen.

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