0

私はこのようなことをすることができます:

public abstract class DeletableEntity
{
    [DataMember]
    public bool Delete { get; set; }
}

[DataContract]
public class MyClass : DeletableEntity
{
    [DataMember]
    public int ID { get; set; }
}

私は本当に必要なのは、他の人がそれを継承できるようにすることだけなのでDeletableEntity、WCF を経由する必要はありませDeleteん。MyClassDeletableEntity

4

2 に答える 2

0

DataContractSerializer がシリアル化を処理する方法には、いくつかのオプションがあります。

  1. 何もしない - .NET 4.0 以降の既定の動作では、[DataContract] または [DataMember] について宣言が行われない場合、すべてのパブリック メンバーが送信されます。
  2. DeletableEntity を [DataContract] として宣言し、シリアライズ可能な [DataMembers] を宣言します。あなたが何かを言うと、WCF はあなたがもっと言いたいと思っていると見なします。

あなたはおそらく#2をしたいと思うでしょう。これを行ったら、DeletableEntity を受け取る WCF メソッドがあり、その派生型である場合は、[KnownTypes] 属性を追加します。おそらく、静的メソッド名を渡す KnownTypes の文字列バージョンを使用したいだけでしょう。次に、静的メソッドはアセンブリでリフレクションを使用して、コードとして追加された新しい項目をメソッドがキャッチできるように、DeletableEntity から派生したすべての型を引き出すことができます。

上記が必要な場合は、次のコードをお勧めします。

[DataContract]
[KnownType("GetKnownTypes")]
public abstract class DeletableEntity
{
  [DataMember]
  public bool Delete { get; set; }

  public static Type[] GetKnownTypes()
  {
    return (from type in typeof (DeletableEntity).Assembly.GetTypes()
            where typeof (DeletableEntity).IsAssignableFrom(type)
            select type).ToArray();
  }
}
于 2012-12-08T19:40:00.043 に答える
0

いいえ、それは不可能です。要件からすると、インターフェイスを使用する方が簡単です。また、アドバイスとして、既知のタイプの使用を検討してください。これはあなたの問題とは直接関係ありませんが、wcf で「ポリモーフィズム」を使用できるようになります。詳細については、http: //msdn.microsoft.com/en-us/magazine/gg598929.aspxを参照してください。

于 2012-12-08T00:04:17.447 に答える