【问题标题】:Overriding a Generated Partial Class覆盖生成的部分类
【发布时间】:2016-06-08 23:18:07
【问题描述】:

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

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

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

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

如果可能的话,我想做的是:


总体目标:
将自定义代码添加到通过导入第三方 WSDL 作为服务引用生成的代码中,这样当第三方更新 WSDL 时,另一个开发人员会不必一定记得深入服务参考的Reference.cs 文件,并替换/添加特定代码。

为了实现这个目标,我需要能够:

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

片段 #1

替换以下内容:

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");
        }
    }

使用此版本的属性/字段,一旦我更改了生成的代码:

private BulkExchangeFileType bulkExchangeFileField;

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

【问题讨论】:

    标签: c# .net web-services


    【解决方案1】:

    使用扩展方法和/或重载继承类中的属性,因此您的代码不会被替换。 要重载属性,您只需要在 public 之前用 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; }
        }
    }
    

    【讨论】:

    • 感谢您的回复。我不确定我是否完全理解您所说的重载属性。您能否编辑您的回复以提供任何示例/样本?我想用另一种类型的属性替换一个属性:定义为byte[] 的属性和定义为BulkExchangeFileType 的属性。我已经更新了我的帖子,详细说明了我在寻找什么。
    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2013-09-24
    • 2012-04-12
    相关资源
    最近更新 更多