2009-07-25 25 views
3

Können Sie die ToString-Funktion in einem WCF-DataContrat überschreiben? Im Moment habe ich:WCF DataContract ToString-Funktion

[DataContract] 
public class Keyword 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

Aber es scheint nicht zu funktionieren. Wie auch immer, damit das funktioniert?

+0

Woher erwarten Sie die Ergebnisse dieser ToString-Methode? –

Antwort

0

Denken Sie auch daran, dass Sie, wenn Sie sowohl den Server als auch den Client besitzen, oft eine gemeinsam genutzte Bibliothek für Datenverträge verwenden können, anstatt einen Client-Proxy zu generieren. Wenn Sie das tun, können Sie sowohl auf dem Server als auch auf dem Client die gleiche Methode verwenden, da sie genau denselben Typ haben.

+2

Ja, und das ist etwas zu vermeiden, als eine allgemeine Regel, wie es den Client fest an den Server bindet; sogar zur _version_ der Serversoftware. –

+1

@ John ist dies nicht der Fall. Dies ist keine binäre Abhängigkeit (wie .NET Remoting). Ich mache das für meine WCF-Client-Server-App und kann verschiedene Assembly-Versionen auf der einen Seite ausrollen, ohne die andere ausrollen zu müssen. Das einzige zu beachtende Problem besteht darin, sicherzustellen, dass die Datenverträge übereinstimmen (Vertragsname, Namespace, Mitgliedsnamen), was ein Problem ist, das sowohl für gemeinsam genutzte Binärdateien als auch für generierte Proxys gilt. –

+0

Noch eine Sache - wenn Ihr Datenvertrag IExtensibleDataObject implementiert, können Sie sogar alte Versionen von Round-Trip-Datenmembern haben, die zur Kompilierzeit nicht enthalten waren! Wenn ich also meinem Datenvertrag ein neues Feld 'Foo' hinzufüge, es an eine alte Version einer Anwendung sende, die es dann zurücksendet, wird der ursprüngliche Wert von 'Foo' in der Antwort immer noch ausgefüllt, obwohl die alte Anwendung Nie war das Anwesen neu. –

1

Wo möchten Sie ToString() aufrufen können? Methoden sind nicht Teil von DataContract, daher sind sie nicht verfügbar, wenn Sie den Proxy für den Client erstellen.

Natürlich hindert Sie nichts daran, diese Methode im Client-Proxy selbst zu programmieren.

+0

Wie würden Sie es im Client tun, s Proxy? –

+0

Sie müssten Zugriff auf den Proxy des Clients haben und die Methode von Hand in die Klasse einprogrammieren. Denken Sie daran, dass ein Datenvertrag genau das ist - ein Vertrag - er ist nicht darauf ausgelegt, irgendein Verhalten zu haben, da die Verhaltensweisen in den Betriebsverträgen sein sollten. Nichtsdestotrotz hindert Sie nichts daran, im Service und im Client irgendwelche Methoden hinzuzufügen, die Sie wünschen. –

2

Ich weiß, das ist alt, aber wollte eine Antwort geben, da ich gerade eine Beispiel-App für einen Mitarbeiter erstellt, der diese Idee verwendet. All diese Arbeiten können auf der Kunden-/Test-Client-Seite durchgeführt werden.

Wenn Sie sich den Code auf dem Consumer/Test-Client und genauer die Klassen ansehen, die als Teil der Service-Referenz generiert werden, sehen Sie den Typ [DataContract], an dem Sie interessiert sind Dazu sollten Sie sicherstellen, dass "Alle Dateien anzeigen" ausgewählt ist. Führen Sie einen Drilldown in die Klasse 'Reference.cs' durch. Dies ist die Spitze meiner Testklasse von Reference.cs:

namespace WebApplication1.UCCTestSvcRef { 
    using System.Runtime.Serialization; 
    using System; 


    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] 
    [System.Runtime.Serialization.DataContractAttribute(Name="UCCRecord", Namespace="http://schemas.datacontract.org/2004/07/UCCTest")] 
    [System.SerializableAttribute()] 
    public partial class UCCRecord : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged { 

Die wichtigen Bits, die Sie die namespace und die partial class sind verwenden müssen. Um diese zu verwenden, müssen Sie einfach eine neue Klasse in Ihrem Test-Client desselben Typs im selben Namespace erstellen und die ToString() -Methode überschreiben. Hier ist ein Beispiel dafür, wie Sie das aus der neu erstellten Datei UCCRecord.cs auf dem Consumer/Test-Client tun können.

namespace WebApplication1.UCCTestSvcRef 
{ 
    public partial class UCCRecord 
    { 
     public override string ToString() 
     { 
      return "Key: " + Key.ToString() + ", Time: " + Timestamp.ToString("d") + ", Value: " + Value; 
     } 
    } 
} 

Bitte beachte, dass ich nur Key und Timestamp und Value verweisen können, weil sie [Datamember] Werte für die [Datacontract].

Dies ist relativ einfach, wenn Sie wissen, was Sie suchen. Wenn irgendetwas hier nicht klar ist, lass es mich bitte wissen und ich werde versuchen es zu klären.

Danke

+0

Eigentlich ist dies die Antwort auf die ursprüngliche Frage. Vielen Dank! – banuj

Verwandte Themen