【问题标题】: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
【解决方案2】:
对于 DataContractSerializer 如何处理序列化,您有两个选择:
- 什么都不做——.NET 4.0 及更高版本中的默认行为是发送所有
如果没有关于 [DataContract] 的声明或
[数据成员]。
- 将 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();
}
}