使用 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 的尝试,是对吗?
提前致谢
添加服务引用时,客户端类型会自动从服务接口生成。您的特定逻辑是内部实现的一部分,服务客户端对此一无所知。
如果您希望在客户端中具有此行为,则不应手动更改生成的代码。每当您更新参考时,它都会被覆盖。
唯一可靠的解决方案是将服务类型隔离在一个单独的程序集中,并在您的服务引用中使用该程序集。为此,请在创建或更新引用时单击 Advanced... 按钮,并通过将程序集添加到 "use types of these assemblies" 列表来将程序集包含在打开的对话框中。
我有一个使用 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 的尝试,是对吗?
提前致谢
添加服务引用时,客户端类型会自动从服务接口生成。您的特定逻辑是内部实现的一部分,服务客户端对此一无所知。
如果您希望在客户端中具有此行为,则不应手动更改生成的代码。每当您更新参考时,它都会被覆盖。
唯一可靠的解决方案是将服务类型隔离在一个单独的程序集中,并在您的服务引用中使用该程序集。为此,请在创建或更新引用时单击 Advanced... 按钮,并通过将程序集添加到 "use types of these assemblies" 列表来将程序集包含在打开的对话框中。