Ich habe Klassen in meinem Dienst definiert alsSvcUtil nicht abstrakte Klassen in der Client-Proxy-Generierung (WCF)
[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; }
}
und in meinem Dienst, verwende ich es als
[ServiceContract]
public interface IService1
{
[OperationContract]
MyAbstract TestAbstract(MyAbstract value);
}
Wie Sie sehen können , die Methode TestAbstract übernimmt und gibt den abstrakten Parameter MyAbstract zurück, jedoch ist der Typ "MyAbstract" in dem Client-Proxy, der von SvcUtil generiert wird, nicht abstrakt! Es erzeugte eine konkrete Klasse.
[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;
}
}
}
Wie kann ich SvcUtil zwingen MyAbstract als abstrakte Klasse zu generieren? Ich bin stecken, bitte helfen ...
Ich nehme an, es ist der DataContractSerializer, der dies nicht unterstützt. XmlSerializer tut dies aber. Wenn Sie beispielsweise svcutil auf einen Webdienst richten, der abstrakte Klassen verwendet, kann er die abstrakten Klassen auf dem Client erstellen. Tun Sie es auf einem WCF-Dienst und es kann nicht mehr. – user20155