如何调用三个数据协定对象并在单个对象中创建它?
我有像这样的数据合约类
[Serializable]
[DataContract]
public class Address
{
[DataMember]
public long AddressId { get; set; }
}
另一个数据合约类,如
[Serializable]
[DataContract]
public class Email
{
[DataMember]
public long EmailId { get; set; }
}
另一个数据合约类,如
[Serializable]
[DataContract]
public class Phone
{
[DataMember]
public long PhoneId { get; set; }
}
现在我想以相同的方法使用AddressId,EmailId,PhoneId。
怎么可能?
答案 0 :(得分:1)
请仅保留[DataContract] attrubute,您也不需要使用Serializable进行装饰。
嗯,WCF数据合同有以下选项:
复合数据合约。
标记为DataMember的任何类的成员字段一旦用DataContract属性修饰,也可以是数据合同。所有嵌套数据协定的聚合说明了数据协定本质上是递归的。 WCF会检测对象图中所有数据合约启用属性,并捕获它们的状态。
[DataContract]
class Address
{
[DataMember]
public long AddressId { get; set; }
}
// The same for the rest two, and then an aggregating type.
[DataContract]
class Contact
{
[DataMember]
public Address Address {get;set;} // here we go
[DataMember]
public Email Email {get;set;}
[DataMember]
public Phone Phone {get;set;}
}
数据合约层次结构
您的数据协定类可能是另一个数据协定类的子类,在这里您只需要明确选择给定的数据协定,即在层次结构树中为每个类型指定DataContract。
[DataContract]
class ContactDetails
{
[DataMember]
public long AddressId { get; set; }
// you could move the phone and email details here too.
}
[DataContract]
class Contact : ContactDetails
{
[DataMember]
public string Name { get; set; }
}
您不能为每个类分别创建三个类,并在.Net中一次性继承它们。我的建议是第一个案例 - 即数据合同聚合。
奖励:多态类型参考。
在基类型上应用[KnownType(Type type)]属性,以将多态对象作为操作契约参数传递。这肯定不是你的情况。
答案 1 :(得分:0)
应用于类的合同为您的服务提供服务元数据(服务类只能将修饰的类用作服务方法中的参数类型)。所以 - 如果你想从现有的属性中组合一些类型(类) - 这与WCF契约无关。