Cru代码。IoC来拯救关于IoC容器的实用性问题,获胜的提交者提到使用IoC容器,您可以执行以下操作:publicstringFirstName{get{return_firstName;}set{stringoldValue=_firstName;_firstName=值;如果(旧值!=值)OnPropertyChanged(“名字”);}}私有字符串_lastName;publicstringLastName{get{return_lastName;}set{stringoldValue=value;_lastName=值;(oldValue!=value)OnPropertyChanged("LastName");为此:varbindingFriendlyInstance=IoC.Resolve(newNotifyPropertyChangedWrapper());问题:为了使您的第二个代码段起作用,NotifyPropertyChangedWrapper肯定必须使用反射(或动态)来生成一个提供与客户兼容的接口并实现自动属性通知的类。不应该有任何数据绑定问题,但会有一点开销。使用动态对象的简化实现可能如下所示:publicclassNotifyPropertyChangedWrapper:DynamicObject,INotifyPropertyChanged{publicNotifyPropertyChangedWrapper(Tobj){_obj=obj;}publicoverrideboolTryGetMember(GetMemberBinderbinder,=out)objectresult{typeof(T).GetProperty(binder.Name).GetValue(_obj);返回真;}//如果您尝试设置类中未定义的属性的值,//将调用此方法。publicoverrideboolTrySetMember(SetMemberBinderbinder,objectvalue){typeof(T).GetProperty(binder.Name).SetValue(_obj,value);OnPropertyChanged(binder.Name);返回真;}//ImplementOnPropertyChanged...}显然,任何使用这些对象之一的代码都会失去任何静态类型安全性。另一种选择是生成一个类,该类实现与被包装的类相同的接口。互联网上有很多这样的例子。主要要求是您的Customer必须是一个接口,或者它需要所有属性都是虚拟的。要以通用方式(即为任何类实现INotifyPropertyChanged的??一段代码)执行此操作,请使用代理。有许多使用Castle.DynamicProxy或LinFu或Unity的实现。这些代理库在IoC容器中有很好的支持,例如DynamicProxy与CastleWindsor有很好的集成,Unity拦截(或任何其他调用)显然与Unity容器有很好的集成。我从未使用过它,但您可以使用PostSharp创建类似的东西。如果您正在寻找自动生成可绑定对象的特定解决方案,您应该查看PropertyChanged.Fody(以前称为NotifyPropertyWeaver)。这将覆盖实现INotifyPropertyChanged的??类以包含通知代码。github页面上有一个示例。在我看来,这比使用建议的IOC容器解决方案更简洁。但是,它是特定于INotifyPropertyChanged绑定的库,因此它不适合通用解决方案,如您的链接问题中所述。以上就是C#学习教程:Cru代码。IoC来拯救共享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
