3

在 Web 服务上下文中,我有以下类继承自 Mammal 类。Mammal 类是在代理中定义的。我无法更改该类的定义。因为我需要在客户端给 Mammal 类添加一些方法,所以我继承了 Mammal 并创建了 Giraffe。

namespace TestApplication
{  
    public class Giraffe : Mammal
    {
        public Giraffe()
        {
        }
    }
}

当我调用一个期望 Mammal 类型对象的 WebMethod 时,我收到以下异常,告诉我不需要 Giraffe。

  Error: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Giraffe was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write6_Tender(String n, String ns, Tender o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write12_PaymentRequestAuthorization(String n, String ns, PaymentRequestAuthorization o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write13_PaymentRequestAuthorization(Object o)
   --- End of inner exception stack trace ---

有解决方法吗?我不能真正添加​​ XmlInclude ...

4

4 回答 4

2

要添加方法,您应该使用部分类。尝试使用(在正确的命名空间等中)添加第二个类文件:

partial class Mammal {
    public void ExtraMethod() {...}
}

partial关键字告诉编译器允许将类拆分为多个文件 - 非常适合代码生成场景。但是,它确实需要partial每个文件中的关键字;这些成员只是简单地组合在一起(C# 3.0 中的部分方法除外,它们有自己的微妙行为)。我希望wsdl.exe(或其他)包含这个!

于 2009-03-04T04:01:18.520 回答
2

如果您只想向无法更改的类添加方法,只需创建扩展方法。

public static class MammalExt {
public static void ExtraMethod(this Mammal mammal) {...}}

虽然如果哺乳动物是一个代理生成的类,它应该是一个部分类。

于 2011-03-10T01:18:06.453 回答
1

您必须使用 XmlInclude。这是你唯一的选择。你必须告诉序列化器你将序列化哪个类,因为它必须生成代码来进行序列化。

写这篇文章的时候让我很震惊,你可能会在让 Giraffe 实现 IXmlSerializable 的情况下侥幸逃脱,但这需要更多的工作。

于 2009-08-03T13:36:16.530 回答
1

正确的答案确实是使用部分类。当您打开客户端项目并生成 Web 引用时,Visual Studio 会解析 WSDL 并生成一个Mammal为您调用的类。此类仅对客户端项目可见,因此您不必担心服务器端的事情。

假设您有一个名为 MyWebService 的 Web 引用。然后会有一个类叫做MyWebService.Mammal. 要将成员添加到此类,您需要做的就是创建一个包含以下内容的新源文件:

namespace MyWebService {
    public partial class Mammal {
        public void ExtraMethod() { ... }
    }
}

当您在 Web 服务上调用返回 a 的方法时Mammal,Web 参考代码将创建“改进的” Mammal 类的新实例,并将线路上的 xml 中的值复制到实例。

于 2011-03-10T10:51:50.850 回答