Frage

Früher lief ich in ein Problem versucht, eine Typdefinition zwischen meinem ASMX webservice zu teilen und meiner ASPX-Seite (Webclient)

Confused auf C # Array von Objekten und impliziten Typ Umwandlung

Als ich den Rat verstehen, das „Problem“ Dies schafft in der Client in ein neues Array von Objekten erstellt durch Kopieren die Array von Objekten gelöst werden, wie durch die ASMX-Proxy-Klasse definiert.

ein Neuling in C # Als ich noch mit dieser einfachen Aufgabe habe Schwierigkeiten. Hier sind weitere Teile meines Code (die anderen Fragmente in der früheren Post bleiben unverändert):

... hier ist, wo ich die „Testdaten“ bevölkern Ich möchte an den Webdienst übergeben:

// create an array of MetaData objects
MetaData[] nvPairs = new MetaData[20];   // arbitrary length of 20 pairs

// create arbitrary MetaData objects in the array
nvPairs[0] = new MetaData("Grant Number", "2577-9912");
nvPairs[1] = new MetaData("OPEAnalyst", "Simpson");

... hier versuche ich, eine Funktion „Kopie“ von „echten“ Typ definiert in meinem TRIMBrokerUtil Namespace an die Proxy-Version dieses Typs (die ich nicht vollständig, weil der Proxy verwenden):

protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[] CopyMetaData(
    MetaData utilArray)
{
    TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray = 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Name.Length];
    int i;
    for (i = 0; i < utilArray.Name.Length; i++)
    {
        outArray[i].Name = utilArray.Name;
        outArray[i].Value = utilArray.Value;
    }
    return outArray;
}

... und dann ist hier, wo ich versuche, auf dieser Linie, die Funktion (Compiler-Flags 2 Fehler zu nennen:

TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData = 
    CopyMetaData(metaDataArray); 
Beide der Kompilierung Fehler unter Punkt

auf derselben Linie:

Fehler 1 Die beste überladene Methode Spiel für '_Default.CopyMetaData (TRIMBrokerUtil.MetaData)' hat einige ungültige Argumente

Fehler 2 Argument '1': aus nicht konvertieren 'TRIMBrokerUtil.MetaData []' auf 'TRIMBrokerUtil.MetaData'

Bin ich in der Nähe?

War es hilfreich?

Lösung

Sie haben erklärt Ihre Parameter werden MetaData statt MetaData[] - mit anderen Worten: es ist kein Array. Sie verwenden utilArray.Name dann eher viel, aber es ist nicht klar, warum.

Ich vermute, dass Sie eigentlich wollen:

protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[]
    CopyMetaData(MetaData[] utilArray)
{
    TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray = 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Length];
    for (int i = 0; i < utilArray.Length; i++)
    {
        outArray[i] = new TRIMBrokerASMXProxy.ASMXProxy.MetaData();
        outArray[i].Name = utilArray[i].Name;
        outArray[i].Value = utilArray[i].Value;
    }
    return outArray;
}

By the way, möchten Sie vielleicht eine using Richtlinie prüfen, diese leichter zu lesen:

using ProxyMetaData = TRIMBrokerASMXProxy.ASMXProxy.MetaData;

...

protected ProxyMetaData[] CopyMetaData(MetaData[] utilArray)
{
    ProxyMetaData[] outArray = new ProxyMetaData[utilArray.Length];
    for (int i = 0; i < utilArray.Length; i++)
    {
        outArray[i] = new ProxyMetaData();
        outArray[i].Name = utilArray[i].Name;
        outArray[i].Value = utilArray[i].Value;
    }
    return outArray;
}

Eine weitere Alternative ist Array.ConvertAll:

ProxyMetaData[] output = Array.ConvertAll(input,
    metaData => new ProxyMetaData(metaData.Name, metaData.Value));

Wenn Sie nicht C # 3 verwenden, können Sie eine anonyme Methode dafür. Wenn ProxyMetaData keinen geeigneten Konstruktor haben und Sie sind mit C # 3, können Sie ein Objekt initializer verwenden:

ProxyMetaData[] output = Array.ConvertAll(input,
    metaData => new ProxyMetaData { metaData.Name, metaData.Value });

Wenn Sie mit C # 2 und ohne entsprechenden Konstruktor stecken, dann:

ProxyMetaData[] output = Array.ConvertAll(input, delegate(MetaData metaData)
{
    ProxyMetaData proxy = new ProxyMetaData();
    proxy.Name = metaData.Name;
    proxy.Value = metaData.Value;
});

I denken , dass alle Grundlagen abgedeckt ist:)

Andere Tipps

Ich würde nur LINQ verwenden, um dies zu tun:

TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData =
    metaDataArray.Select(d => 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData(
            d.Name, d.Value)).ToArray();

Außerdem, wenn Sie .NET 3.5 verwenden, bedeutet dies, Sie WCF auch verwenden können, das ist, was Sie sollten die Proxy generieren werden. Sie wäre in der Lage, Ihren TRIMBrokerASMXProxy.ASMXProxy.MetaData Typen mit dem Attribute Datacontract zuzuschreiben und die Mitglieder mit dem Datamember-Attribute serialisiert werden. Dann Sie wäre in der Lage Ihren Vertrag mit dem tatsächlichen Typ zu definieren, und nicht die Konvertierung durchzuführen haben überhaupt.

Sie können auch Array.ConvertAll verwenden. Ich weiß, ich ist relativ neu in dieser so lassen Sie mich versuchen zu erklären. Es verfügt über 2 allgemeine Parameter. Die erste ist die Art der Anordnung ist es umwandeln will (nennen wir es I). Und der zweite die Typ, den Sie konvertieren möchten (nennen wir es O). Er nimmt einen Array vom Typ I und gibt einen Array von Typ O. Der zweite Parameter ist ein Konverter delegieren. Die Anwendung der Namensgebung wir seine Unterschrift haben geht so.

delegate O Converter(I input);

Der Körper des Delegierten müssen den Code enthalten, notwendig, um die Konvertierung zu tun. Im Innern der ConvertAll Funktion, der Code iteriert durch jeden des Wertes in dem Eingabefeld und gelangt dann zu den Delegierten. Der Wert, der durch die Delegierten zurückgegeben wird dann in ein Ausgangsfeld gespeichert. Der Ausgabe-Array wird an den Benutzer, wenn alle Werte zurück umgewandelt werden.

using ProxyMetaData = TRIMBrokerASMXProxy.ASMXProxy.MetaData;

ProxyMetaData[] convertedArray = Array.ConvertAll<MetaData, ProxyMetaData>(utilArray, 
delegate(MetaData metaData)
{
    ProxyMetaData returnValue = new ProxyMetaData();
    returnValue.Name = metaData.Name;
    returnValue.Value = metaData.Value;
    return returnValue;
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top