0

3 つのデータ コントラクト オブジェクトを呼び出して、それを 1 つのオブジェクトに作成する方法は?

このようなデータ コントラクト クラスがあります。

 [Serializable]
    [DataContract]
    public class Address
    {
        [DataMember]
        public long AddressId { get; set; }
}

次のような別のデータ コントラクト クラス

 [Serializable]
    [DataContract]
    public class Email
    {
        [DataMember]
        public long EmailId { get; set; }
    }

次のような別のデータ コントラクト クラス

[Serializable]
    [DataContract]
    public class Phone
    {
        [DataMember]
        public long PhoneId { get; set; }
    }

今、同じメソッドで AddressId、EmailId、PhoneId を使用したいと考えています。

それはどのように可能ですか??

4

2 に答える 2

1

[DataContract]の属性のみを保持してください。Serializableで装飾する必要もありません

WCFデータコントラクトには次のオプションがあります。

複合データ契約。

DataMemberとしてマークされたクラスのメンバーフィールドは、DataContract属性で装飾されていれば、それ自体がデータコントラクトになることができます。ネストされたすべてのデータコントラクトの集約は、データコントラクトが本質的に再帰的であるという事実を示しています。WCFは、オブジェクトグラフ内のすべてのデータコントラクト対応プロパティを検出し、それらの状態もキャプチャします。

[DataContract]
class Address
{
    [DataMember]
    public long AddressId { get; set; }
}

// The same for the rest two, and then an aggregating type.

[DataContract]
class Contact
{
    [DataMember]
    public Address Address {get;set;} // here we go

    [DataMember]
    public Email Email {get;set;}

    [DataMember]
    public Phone Phone {get;set;}
}

データ契約階層

データコントラクトクラスは別のデータコントラクトクラスのサブクラスである可能性があります。ここでは、特定のデータコントラクトを明示的にオプトインする必要があります。つまり、階層ツリーの各タイプでDataContractを指定する必要があります。

[DataContract]
class ContactDetails
{
    [DataMember]
    public long AddressId { get; set; }

    // you could move the phone and email details here too.
}

[DataContract]
class Contact : ContactDetails
{
    [DataMember]
    public string Name { get; set; }
}

.Netで、それぞれに3つの個別のクラスを設定し、それらから一度に継承することはできません。そして、私の提案はあなたにとって最初のケースです-それはデータ契約の集約です。

ボーナス:ポリモーフィック型リファレンス。

ポリモーフィックオブジェクトを操作コントラクト引数として渡すための基本型に[KnownType(Type type)]属性を適用します。これは間違いなくあなたの場合ではありません。

于 2012-11-27T21:17:10.793 に答える
0

サービスのサービス メタデータを提供するためにクラスに適用されるコントラクト (サービス クラスは、装飾されたクラスをサービス メソッドのパラメーター型として使用できます)。そのため、既存のプロパティから何らかのタイプ (クラス) を構成する場合、これは WCF コントラクトとは関係ありません。

于 2012-11-27T08:31:09.610 に答える