gpt4 book ai didi

c# - 订阅 WCF 服务的 DataContract 代理类的 PropertyChanged

转载 作者:太空狗 更新时间:2023-10-30 00:58:49 25 4
gpt4 key购买 nike

我喜欢在客户端扩展类的想法,这些类是使用部分类的 WCF 服务的数据契约。但是我遇到了一个大大破坏聚会的问题。

假设在服务器端我有一个类:

[DataContract]
public class SolidObject
{
[DataMember]
public Point Position { get; set; }
[DataMember]
public Size Size { get; set; }
}

在客户端,我生成了一个代理类,用于业务逻辑层。根据业务逻辑的需要我这样扩展:

public partial class SolidObject
{
public Rect Bounds { get { return new Rect(Position.X - Size.Width / 2, Position.Y - Size.Height / 2, Size.Width, Size.Height); }}
}

现在我想确保只要 Position 或 Size 发生变化,就会调用 Bounds chage 事件。通过代码很容易做到:

PropertyChanged += (sender, e) =>
{
if ((e.PropertyName == "Position") || (e.PropertyName == "Size")) PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Bounds"));
};

问题是把这段代码放在哪里比较好。

如果对象不是由服务调用创建的,我会将其放入构造函数中。但是 WCF 服务会忽略客户端的构造函数,请参阅 constructor not showing up in my WCF client, serialization problem? .

现在,在服务响应之后,我的程序立即搜索数据契约层次结构,获取所需的对象并添加事件处理程序。但我认为这不是一件正确的事情。

所以我感兴趣的是在哪里做更好,或者,也许,推理整个方法应该改变。任何想法表示赞赏。

最佳答案

您可以使用 [OnDeserlialized] 属性插入一个在反序列化后调用的方法。

public partial class SolidObject
{
public Rect Bounds
{
get
{
return new Rect(Position.X - Size.Width / 2, Position.Y - Size.Height / 2, Size.Width, Size.Height);
}
}

[OnDeserialized]
public void Initialize(StreamingContext streamingContext)
{
PropertyChanged += (sender, e) =>
{
if ((e.PropertyName == "Position") || (e.PropertyName == "Size"))
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Bounds"));
};
}
}

关于c# - 订阅 WCF 服务的 DataContract 代理类的 PropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2178029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com