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成员MyClass而不必发送DeletableEntity吗?

4

2 回答 2

0

不,那应该是不可能的。根据您的要求,使用接口会更简单。另外,作为建议,请考虑使用已知类型。这与您的问题并不直接相关,但它允许您在 wcf 上使用“多态性”。可以在此处获得更多详细信息:http: //msdn.microsoft.com/en-us/magazine/gg598929.aspx

于 2012-12-08T00:04:17.447 回答
0

对于 DataContractSerializer 如何处理序列化,您有几个选择:

  1. 什么都不做——如果没有关于 [DataContract] 或 [DataMember] 的声明,.NET 4.0 和更高版本中的默认行为是发送所有公共成员。
  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 回答