我的服务中的课程定义为
[DataContract]
[KnownType(typeof(MyConcrete1)) ]
[KnownType(typeof(MyConcrete2)) ]
public abstract class MyAbstract
{
[DataMember]
public int AbsInt { get; set; }
}
[DataContract]
public class MyConcrete1 : MyAbstract
{
[DataMember]
public int Concrete1Int { get; set; }
}
[DataContract]
public class MyConcrete2 : MyAbstract
{
[DataMember]
public int Concrete2Int { get; set; }
}
在我的服务中,我将其用作
[ServiceContract]
public interface IService1
{
[OperationContract]
MyAbstract TestAbstract(MyAbstract value);
}
正如您所看到的,TestAbstract方法接受并返回抽象参数MyAbstract,但是在SvcUtil生成的客户端代理中,类型“ MyAbstract ”不是抽象的 !它产生了一个具体的类。
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name = "MyAbstract", Namespace = "http://schemas.datacontract.org/2004/07/WcfService")]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(WcfService.MyConcrete1))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(WcfService.MyConcrete2))]
public partial class MyAbstract : object, System.Runtime.Serialization.IExtensibleDataObject
{
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
private int AbsIntField;
public System.Runtime.Serialization.ExtensionDataObject ExtensionData
{
get
{
return this.extensionDataField;
}
set
{
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public int AbsInt
{
get
{
return this.AbsIntField;
}
set
{
this.AbsIntField = value;
}
}
}
如何强制svcUtil生成MyAbstract作为抽象类?我被困住了,请帮忙......
答案 0 :(得分:2)
你不能 - svcutil不能知道MyAbstract类是抽象的。在服务器和客户端之间交换的元数据不支持这样的概念。 SOA世界并不总是支持OO世界的所有内容。
服务元数据只知道服务,方法调用和数据协定等内容 - 其他任何内容都不属于服务元数据。
一旦创建了客户端代码,您将需要添加一些额外的逻辑和调整,如果这是您的真正需求。
马克