WCF DataContract ToString函数

3

你能在WCF DataContract中覆盖ToString函数吗?目前我的代码是这样的:

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

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

但似乎这不起作用。有什么方法可以让它工作吗?


你认为在哪里可以看到 ToString 方法的执行结果呢? - Drew Noakes
3个回答

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]的[DataMember]值。
如果你知道要找什么,这相对简单。如果有任何不清楚的地方,请告诉我,我会尽力澄清。
谢谢。

实际上,这就是原问题的答案。谢谢! - banuj

1
你想在哪里调用 ToString() 方法?方法并不是 DataContract 的一部分,因此在为客户端创建代理时不可用。当然,没有什么可以阻止你自己在客户端的代理中编写该方法。

你会在客户端代理中如何实现它? - Eric Packwood
你需要访问客户端的代理,并手动将该方法编码到类中。请记住,数据契约只是一个契约,它不应该具有任何行为,因为行为应该在操作契约中。话虽如此,在服务和客户端中添加任何所需的方法都没有任何问题。 - Andrew Hare

0

还要记住,如果您拥有服务器和客户端,通常可以使用共享库来进行数据契约,而不是生成客户端代理。如果这样做,那么您可以在服务器和客户端上具有相同的方法,因为它们完全相同。


2
是的,这是一件应该避免的事情,因为它会将客户端紧密地绑定到服务器上,甚至绑定到服务器软件的版本。 - John Saunders
1
@John,这不是这种情况。这不是二进制依赖项(就像.NET远程处理一样)。我为我的WCF客户端-服务器应用程序做到了这一点,并且可以在一侧推出不同的程序集版本而无需推出另一侧。唯一需要注意的问题是确保数据契约匹配(契约名称、命名空间、成员名称),这是共享二进制文件或生成的代理所共有的问题。 - Drew Noakes
还有一件事——如果您的数据契约实现了IExtensibleDataObject,甚至可以往返传输在编译时未包含的旧版本数据成员!因此,如果我向我的数据契约添加一个新字段“Foo”,将其发送到某个应用程序的旧版本,然后再将其发送回来,即使旧应用程序不知道该属性的存在,'Foo'的原始值仍将填充响应中。 - Drew Noakes
你说得对,这不是像Remoting那样的版本依赖关系。但它确实存在依赖关系。客户端使用的程序集版本需要与服务端使用的版本兼容。对于ToString来说没什么大问题,但如果服务器对客户端工作方式或反之有假设,则会更加麻烦。 - John Saunders
1
即使您使用代理,客户端代理的版本也必须与服务兼容。这是无法避免的。如果您的数据契约主要作为DTO(数据传输对象)行为,则不太可能有除ToString或其他内容之外的逻辑。我更喜欢将大部分DTO放在共享库中,因为幸运的是,WCF不会创建二进制耦合。像所有事情一样,这取决于您的情况。 - Drew Noakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接