[DataContract]
Base
{
[DataMember]
public int Id {get;set;}
}
[DataContract]
A : Base
{
[DataMember]
public string Value {get;set;}
}
[ServiceContract]
interface IService
{
[OperationContract]
void SetValue (Base base);
}
有没有办法像下列样式一样使用服务:
new Service ().SetValue (new A ());
答案 0 :(得分:1)
您标记了此WCF,因此我假设您要使用它。
您需要使用ChannelFactory连接到端点,然后打开该频道。
这不起作用:
new Service ().SetValue (new A ());
你需要做什么。像这样:
using (var scf = new ChannelFactory< IService >(<Binding>,<EndpointAddress>)
{
IService proxy = scf.CreateChannel();
proxy.SetValue(new (A));
}
这将返回一个实现IService接口的代理对象。您可以在此对象上调用SetValue。
答案 1 :(得分:0)
除了改变@Flo所指示的调用服务的方式之外,您还需要进行一些小的更改以准备Data Contract Serializer来处理继承层次结构。
最简单的方法是使用KnownTypeAttribute装饰Base。像这样,
[DataContract]
[KnownType(typeof(A))]
Base
{
[DataMember]
public int Id {get;set;}
}
[DataContract]
A : Base
{
[DataMember]
public string Value {get;set;}
}