使用 INotifyPropertyChanged 生成 reference.cs 丢失代码

Generated reference.cs losing code with INotifyPropertyChanged

我有一个使用 BasicHttpBinding 的服务参考,但是当使用 VS 生成 reference.cs 时,一些未实现 RaisePropertyChanged 的​​属性现在执行(尽管这是可以接受的)并且 setter 中的逻辑是 ignored/removed(这是非常不可接受的!)。

我试过以各种不同的方式配置服务引用并将逻辑放在 RaisePropertyChanged 事件中,但似乎没有什么可以解决这个问题。

非常感谢任何帮助,下面是简短的代码。

服务中的原始代码

public class Entry : INotifyPropertyChanged
{

    private string m_Firstname;
    private string m_Foo;

    public string Firstname
    {
        get { return m_Firstname; }
        set
        {
            m_Firstname = value;

            Foo = "bar";

            OnPropertyChanged("Firstname");
        }
    }

    public string Foo
    {
        get { return m_Foo; }
        set { m_Foo = value; }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null))
        {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }

}

在Reference.cs

中生成代码
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1586.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.domain.com/")]
public partial class Entry : object, INotifyPropertyChanged {

    private string firstnameField;
    private string foo;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=1)]
    public string Firstname {
        get { return this.preferredContactMethodField; }
        set {
            this.firstnameField = value;
            this.RaisePropertyChanged("Firstname");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=2)]
    public string Foo {
        get { return this.foo; }
        set {
            this.foo= value;
            this.RaisePropertyChanged("Foo");
        }
    }


    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

请注意,在 Firstname setter 中设置 Foo 的尝试已经消失,并且出现了 Foo setter 中的 RaisePropertyChanged。

据我所知,这是生成 Reference.cs 文件的过程的一部分,我无法做任何事情来让我的原始代码通过 - 特别是设置 Foo 的尝试,是对吗?

提前致谢

添加服务引用时,客户端类型会自动从服务接口生成。您的特定逻辑是内部实现的一部分,服务客户端对此一无所知。

如果您希望在客户端中具有此行为,则不应手动更改生成的代码。每当您更新参考时,它都会被覆盖。

唯一可靠的解决方案是将服务类型隔离在一个单独的程序集中,并在您的服务引用中使用该程序集。为此,请在创建或更新引用时单击 A​​dvanced... 按钮,并通过将程序集添加到 "use types of these assemblies" 列表来将程序集包含在打开的对话框中。