3

您可以覆盖 WCF DataContrat 中的 ToString 函数吗?现在我有:

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

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

但这似乎不起作用。无论如何让这个工作?

4

3 回答 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] 值。

如果您知道要查找的内容,这相对简单。如果这里有什么不清楚的地方,请告诉我,我会尽力澄清。

谢谢

于 2012-01-23T16:06:58.213 回答
1

您希望能够在哪里调用ToString()?方法不是 DataContract 的一部分,因此在您为客户端创建代理时它们将不可用。

当然,没有什么能阻止您自己在客户端代理中编写该方法。

于 2009-07-25T02:46:17.180 回答
0

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

于 2009-07-25T10:27:00.113 回答