【问题标题】:Can I expose a DataMember of a class that is not a DataContract?我可以公开不是 DataContract 的类的 DataMember 吗?
【发布时间】:2012-12-07 17:16:38
【问题描述】:

我可以这样做吗:

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

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

我真的只需要DeletableEntity,所以其他人可以继承它,所以它不需要通过WCF,我可以用我的MyClass发送它的Delete成员,而不必发送DeletableEntity作为好吗?

【问题讨论】:

    标签: c# .net wcf datacontract datamember


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      1. 什么都不做——.NET 4.0 及更高版本中的默认行为是发送所有 如果没有关于 [DataContract] 的声明或 [数据成员]。
      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();
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-11-04
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 2020-10-08
        • 2012-01-23
        • 1970-01-01
        • 2016-02-18
        • 2012-06-18
        相关资源
        最近更新 更多