1

次のようなWCFサービスのクラスがあります

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

サービス参照が追加されたクライアント側で、オブジェクト ブラウザーで参照を開きましたが、"IExtensibleDataObject" のような継承されたインターフェイスとして ICloneable を渡しませんでした。

[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 に答える