我可以公开不是DataContract的类的DataMember吗?

时间:2012-12-07 17:16:38

标签: c# .net wcf datacontract datamember

我可以这样做:

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

2 个答案:

答案 0 :(得分:0)

不,这不应该是可能的。根据您的要求,使用接口会更简单。另外,作为建议,请考虑使用已知类型。这与你的问题没有直接关系,但它允许你使用'多态“而不是wcf。 更多细节可以在这里获得: http://msdn.microsoft.com/en-us/magazine/gg598929.aspx

答案 1 :(得分:0)

DataContractSerializer如何处理序列化有几个选项:

  1. 什么也不做 - .NET 4.0及更高版本中的默认行为是发送所有内容 公共成员,如果没有关于[DataContract]或 [数据成员。
  2. 将DeletableEntity声明为[DataContract]并声明serializable [DataMembers]。一旦你说了什么,WCF假设你想说更多。
  3. 你可能想要做#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();
      }
    }