2009-07-25 74 views
3

您可以重寫WCF DataContrat中的ToString函數嗎?現在我有:WCF DataContract ToString函數

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

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

但它似乎沒有工作。無論如何,讓這個工作?

+0

你希望看到這個ToString方法的結果? – 2009-07-25 10:27:19

回答

0

還請記住,如果您擁有服務器和客戶端,那麼通常可以使用共享庫來獲取數據合同,而不是生成客戶端代理。如果你這樣做,那麼你可以在服務器和客戶端上使用相同的方法,因爲它們是完全相同的類型。

+2

是的,一般來說,這是要避免的,因爲它將客戶端緊密綁定到服務器;甚至是服務器軟件的版本。 – 2009-07-25 11:00:58

+1

@約翰事實並非如此。這不是一個二進制依賴項(就像.NET遠程處理一樣)。我爲我的WCF客戶端服務器應用程序執行此操作,並且可以在一側推出不同的裝配版本,而無需推出其他裝配版本。需要注意的唯一問題是確保數據契約匹配(契約名稱,名稱空間,成員名稱),這是共享二進制文件或生成的代理共有的問題。 – 2009-07-25 11:40:34

+0

還有一件事 - 如果你的數據契約實現了IExtensibleDataObject,你甚至可以擁有編譯時未包含的舊版本往返數據成員!因此,如果我將新字段'Foo'添加到我的數據協定中,請將其發送到某個應用程序的舊版本,然後將其發回,'Foo'的原始值仍將填充到響應中,即使舊應用程序從來沒有新的財產存在。 – 2009-07-25 11:43:49

1

你想在哪裏調用ToString()?方法不是DataContract的一部分,因此它們在爲客戶端創建代理時不可用。

當然,沒有什麼會阻止你自己在客戶端的代理中編寫該方法。

+0

你會如何做到這一點在客戶端的代理? – 2009-07-25 02:58:52

+0

您必須有權訪問客戶端的代理並手動將該方法編碼到類中。請記住,數據合同就是這樣 - 合同 - 它不是設計成具有任何行爲,因爲行爲應該在操作合同中。這就是說,沒有什麼能阻止你在服務和客戶端添加你所希望的任何方法。 – 2009-07-25 03:19:52

2

我意識到這是舊的,但想提供一個答案,因爲我剛剛爲使用此想法的同事創建了示例應用程序。所有這些工作都可以在消費者/測試客戶端完成。

如果您查看使用者/測試客戶端上的代碼,更具體地說,作爲服務引用的一部分生成的類,您將看到您感興趣的[DataContract]類型。這應該確保選中「顯示所有文件」。深入到'Reference.cs'類。 這是我的測試類的從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 { 

,你將需要使用的重要位是namespacepartial class。爲了使用這些,你只需要在相同類型的測試客戶端中創建一個新類,然後重寫ToString()方法。 下面是如何從消費者/測試客戶端上新創建的UCCRecord.cs文件中執行此操作的示例。

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

請注意,我只能引用KeyTimestampValue,因爲他們是[數據成員]值的[DataContract]。

這是相對簡單的,如果你知道你在找什麼。如果此處有任何不清楚的地方,請告訴我,我會嘗試澄清。

謝謝

+0

其實,這是對原始問題的回答。謝謝! – banuj 2014-06-12 14:42:28