我怀疑我在这里很傻但是我有以下设置
Class MustInherit myBaseClass
'some stuff
End Class
Class myInheritedClassA
inherits myBaseClass
'some more stuff
End Class
Class myInheritedClassB
inherits myBaseClass
'some more stuff
End Class
然后我有一个有方法
的网络服务Function getSomeClass(id) as myBaseClass
'a factory here dependent on the id will generate a myInherited Class
return CType(aInstanceOfInheritedClass, mybaseClass)
End function
运行此操作会导致以下错误
Unhandled Exception: System.InvalidOperationException:
There was an error generating the XML document. --->
System.InvalidOperationException:
The type <type> was not expected.
Use the XmlInclude or SoapInclude attribute to specify types
that are not known statically."
所以我的问题是,是否有任何方法可以将继承的类“扩展”到基类,这样可行吗?
编辑:RE:关于XmlInclude(typeof inheritedClass)的建议,目前这个方法可能会返回许多类型的继承类(即myInheritedClassA和myInheritedClassB),只需要在这个标签中添加每个inheritedTypes ?
我修改了这个例子,希望能让事情更清楚
答案 0 :(得分:3)
您必须使用XmlIncludeAttribute指定要返回的实际类型。
根据msdn XmlIncludeAttribute
在样本下方应用XmlIncludeAttribute时, 指定派生类的类型。 当XmlSerializer序列化时 包含基数和 派生类,它可以 识别两种对象类型。
您可以使用XmlIncludeAttribute 包括服务中的派生类 写的描述文件 在Web服务描述中 语言(WSDL)。例如,如果是 方法返回一个Object,应用了 XmlIncludeAttribute到方法和 指定要返回的实际类型。
将atttibute应用于Web方法
<WebMethod(), XmlInclude(GetType(myInheritedClass))>
Function getSomeClass(id) as myBaseClass
'a factory here dependent on the id will generate a myInherited Class
return CType(aInstanceOfInheritedClass, mybaseClass)
End function
答案 1 :(得分:1)
您是否尝试过以下操作,即为GetSomeClass()返回的任何不同的继承类添加属性类SoapInclude? (见this MSDN reference)
编辑: SoapInclude 是您使用SOAP编码,但确实使用 XmlInclude ,如果您的Web服务不是SOAP-per-se(它可能更好用于;-),语法相同)
<WebMethod(), SoapRpcMethod, SoapInclude(GetType(myInheritedClass)), _
SoapInclude(GetType(MustInherit))>
Function getSomeClass(id) as myBaseClass
'a factory here dependent on the id will generate a myInherited Class
return CType(aInstanceOfInheritedClass, mybaseClass)
End function