DataContractSerializer がシリアル化を処理する方法には、いくつかのオプションがあります。
- 何もしない - .NET 4.0 以降の既定の動作では、[DataContract] または [DataMember] について宣言が行われない場合、すべてのパブリック メンバーが送信されます。
- 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();
}
}