2009-07-25 56 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