1

我们在 WCF 服务中有一个类,如下所示

[DataContract]
public class SampleClass:ICloneable
{ public object Clone()  { return MemberwiseClone(); } .... }

在添加服务引用的客户端,我在对象浏览器中打开引用,但它没有将 ICloneable 作为继承的接口传递,如“IExtensibleDataObject”

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

有谁知道我怎样才能通过它?

4

1 回答 1

2

它不能也不应该通过。对象是否实现ICloneable不是服务契约的一部分。服务器不关心客户端是否正在克隆对象,也不能提供克隆操作的实现。

如果你希望你的对象是可克隆的,你必须在客户端提供一个实现——注意类是partial,所以你可以简单地创建一个新文件,内容如下:

public partial class SampleClass : ICloneable {
    public object Clone() { 
        return MemberwiseClone();
    }
}

当然,如果您必须为所有生成的类型执行此操作,那可能会很痛苦。如果您也在编写服务(或可以访问源代码)并且已经包含正确的Clone实现,则可以通过将它们放在单独的程序集中在客户端和服务器中使用相同的类。这并非完全无关紧要,因为您需要解决 Visual Studio 中的一些顽固问题;有关详细信息,请参阅“客户端和服务之间的 WCF 和共享引用库”。

请注意,MSDN 说

ICloneable接口只要求您的Clone方法实现返回当前对象实例的副本。它没有指定克隆操作是执行深拷贝、浅拷贝还是介于两者之间。它也不需要将原始实例的所有属性值复制到新实例。例如,该NumberFormatInfo.Clone方法对除属性之外的所有属性进行浅拷贝NumberFormatInfo.IsReadOnly ;它总是在克隆对象中将此属性值设置为 false。由于调用者Clone不能依赖于执行可预测克隆操作的方法,我们建议 ICloneable不要在公共 API 中实现。

如果您需要一个可克隆的对象,您仍然可以实现自己的Clone方法(并MemberwiseClone在合适的情况下使用),但可能没有充分的理由使用ICloneable.

于 2014-11-26T21:28:13.917 回答