Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据契约和继承?_C#_Wcf - Fatal编程技术网

C# 数据契约和继承?

C# 数据契约和继承?,c#,wcf,C#,Wcf,如何将DataContract与继承一起使用?下面的代码可以工作吗 [DataContract] public class ConsoleData { [DataMember] public String Description { get; set; } } [DataContract] public class SomeData : ConsoleData { [DataMember] public int Volume { get; set; }

如何将DataContract与继承一起使用?下面的代码可以工作吗

[DataContract]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }

}

[DataContract]
public class SomeData : ConsoleData
{

    [DataMember]
    public int Volume { get; set; }
    ......

如果要为ServiceContract使用XmlSerializerFormat,则需要使用KnownType属性:

[DataContract]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }
}

[DataContract, KnownType(typeof(ConsoleData))]
public class SomeData : ConsoleData
{
    [DataMember]
    public int Volume { get; set; }
}
是的,那会有用的

DataContractAttribute
已将
Inherited
设置为false,因此有必要将该属性同时应用于子类和父类(正如您在问题中所做的那样)


如果要将数据契约与多态性一起使用,则需要使用
KnownType
属性

比如说

 [ServiceContract]
 interface MyWcfContract
 {
       [OperationContract]
       HandleData(ConsoleData contractData);
 }
如果您这样调用该方法:

 SomeData someData = new SomeData { Description = "Test", Volume = 30 };
 // The method is expecting a ConsoleData instance, 
 // I'm passing a SomeData instance instead
 myWcfProxy.HandleData(someData);
然后,服务端上的反序列化程序将不知道它是
SomeData
的实例,而只是它所期望的
ConsoleData
的实例。 解决此问题的方法是将
SomeData
类注册为
ConsoleData
的已知类型

[DataContract]
[KnownType(typeof(SomeData))]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }

}

[DataContract]
public class SomeData : ConsoleData
{

    [DataMember]
    public int Volume { get; set; }
    ......

对您打算如何处理这两个数据契约?没有
KnownType
,什么将不起作用?我已经尝试了我在描述中写的代码,它似乎可以解决这个问题。将KnownType(typeof(SomeData))放在基类(ConsoleData)上是有意义的,它允许您将子实例传递给需要基实例的方法。但是我认为您不需要将它放在子实例上。@javapowered:如果您决定不使用KnownType属性,请小心,因为在某些特殊情况下需要它。一个这样的例子是,如果您要将某些数据作为另一个DataContract的属性公开。@AndrewShepherd:在我几周前对它所做的测试中,属性是放在父级还是子级上似乎并不重要(它以任何方式工作)。@M.Babcock-很抱歉在这里纠缠:在我尝试的情况下,您不需要KnownType属性。您能否提供一个实际需要KnownType属性的示例用法?(一段没有属性就无法工作的代码)@Andrew。我和这些问题斗争了很长时间。是否有可能在
[OperationContract]中处理数据(基本数据)并从SoapUI发送一些从
Base
驱动的对象?然后,如果c#知道在
base
上它是某个子类的hold实例,因此它也调用了适当的方法(多态性等),那么[KnownType(typeof(SomeData))]中有一个小的语法错误,谢谢你的帮助。@Shanjee谢谢,我添加了额外的括号。花了七年时间才有人注意到:——)