我正在阅读编程实体框架4.0,我在POCO&WCF章节。
在生成代理类之后,我看到了生成的代码:
public partial class StateObject : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
/* ........... */
[System.Runtime.Serialization.DataMemberAttribute()]
public ConsoleApplicationPOCO.POCOCustomerService.State State {
get {
return this.StateField;
}
set {
if ((this.StateField.Equals(value) != true)) {
this.StateField = value;
this.RaisePropertyChanged("State");
}
}
}
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));
}
}
我脑海中浮现出几个问题:
- 代码生成器如何知道如何实现setter方法,特别是调用RaisePropertyChanged方法和if语句
- 生成器如何知道如何实现受保护的void RaisePropertyChanged(字符串propertyName)
- 作者说,这个解决方案可以用于不使用.NET的客户端。如果我们仍然依赖INotifyPropertyChanged和IExtensibleDataObject
1)生成器查看目标类公开的DataMembers,并为每个属性创建一个getter和setter属性。
2) Microsoft决定生成的类将实现System.ComponentModel.INotifyPropertyChanged
接口,因此每个生成的setter都包含对RaisePropertyChanged
的调用以支持该接口。这是需要一个完整的属性设置器的部分原因。
3) 这只是微软针对该服务的客户端实现。如果从另一个编程IDE添加对该服务的引用,则不会获得.Net框架特定的生成代码。IDE将根据自己的需要生成服务参考代码。