Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以公开不是DataContract的类的DataMember吗?_C#_.net_Wcf_Datacontract_Datamember - Fatal编程技术网

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

C# 我可以公开不是DataContract的类的DataMember吗?,c#,.net,wcf,datacontract,datamember,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,这样其他人就可以继承它,这样

我可以这样做吗:

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

不,这应该是不可能的。根据您的需求,使用接口会更简单。此外,作为一个建议,请考虑使用已知的类型。这实际上与您的问题没有直接关系,但它允许您在wcf上使用“多态性”。 更多详情请访问:

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

  • 不执行任何操作--.NET4.0及更高版本中的默认行为是发送所有 如果未就[DataContract]或 [数据成员]
  • 将DeletableEntity声明为[DataContract],并声明可序列化的[DataMembers]。一旦你说了什么,WCF就认为你想说更多
  • 你可能会想做第二件事。一旦这样做了,如果您有任何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();
      }
    }