覆盖生成的部分类

时间:2016-06-08 23:18:07

标签: c# .net web-services

我已将第三方WSDL(通过服务参考)导入我的控制台应用程序项目,以便通过Web服务发送和接收数据。为了使其正常运行,我必须在与Web Service关联的Reference.cs文件中添加一些代码。虽然这有效,但如果对WSDL进行了更新,并且我重新导入/生成该服务引用,那么该解决方法将会消失。

为了解决这个问题,我已将必要的代码更改保存到项目中保存的外部文本文件中。

我很好奇是否有人知道我可以在服务引用之外将这些更改写入自己的单独类中,但仍然可以通过服务引用引用,因此使用“正确”代码需要从Web服务发送/接收。

我有两个类(未包含在生成的代码中),在将它们分成自己的.cs文件并引用服务参考使用的namespace后,我可以在生成的代码中引用它们

如果可能,我想做的是以下内容:

<小时/> 总体目标:
将自定义代码添加到通过将第三方WSDL作为服务引用导入生成的代码中,这样当第三方更新WSDL时,另一个开发人员就不必记得潜入{{1} }服务引用的文件,并替换/添加特定代码。

要实现这一目标,我需要能够:

  1. 替换生成的现有属性和关联字段 Reference.cs,带有自定义版本(请参阅下面的代码段#1)。
  2. 将现有生成的partial class替换为该类的自定义版本,具有不同的属性定义和略有不同的属性/字段定义。
  3. Snippet#1

    替换以下内容:

    partial class

    这个版本的属性/字段在我更改生成的代码后起作用了:

    private byte[] bulkExchangeFileField;
    
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:us:gov:treasury:irs:common", DataType = "base64Binary", Order = 0)]
    public byte[] BulkExchangeFile
    {
       get { return this.bulkExchangeFileField; }
       set
            {
                this.bulkExchangeFileField = value;
                this.RaisePropertyChanged("BulkExchangeFile");
            }
        }
    

1 个答案:

答案 0 :(得分:0)

使用扩展方法和/或重载inhered类中的属性,因此不会替换您的代码。 要重载属性,您只需要在公共之前使用单词new声明它,如:new public BulkExchangeFileType BulkExchangeFile,因此当您使用该对象时,它将调用您的属性而不是Web服务定义的属性

以下是如何创建扩展方法https://msdn.microsoft.com/library/bb383977.aspx

class Program
{
    static void Main(string[] args)
    {
        InheredClass test = new InheredClass(); // Do this
        BaseClass test2 = new InheredClass(); // don't do this

        Console.WriteLine(test.MyProperty.GetType());
        Console.WriteLine(test2.MyProperty.GetType());
        Console.Read();
    }


    class BaseClass
    {
        public int MyProperty { get; set; }
    }

    class InheredClass : BaseClass
    {
        new public decimal MyProperty { get; set; }
    }
}