.net – 任何取消注册WPF依赖属性的方法?
我在单元测试中遇到了一个不寻常的问题.我正在测试的类在运行时动态创建依赖项属性,并且该依赖项属性的类型可以根据具体情况而变化.在编写单元测试时,我需要创建具有不同类型的依赖项属性,这会导致错误,因为您无法重新定义现有的依赖项属性.
那么有没有办法取消注册依赖属性或更改现有依赖属性的类型? 谢谢! OverrideMetadata()只允许您更改默认值等极少数内容,因此无效. AppDomain方法是一个好主意,可能会工作,但似乎比我真正想要深入研究单元测试更复杂. 我从未找到取消注册依赖项属性的方法,因此我进行了细分并仔细重新组织了单元测试以避免出现问题.我的测试覆盖率有所降低,但由于这个问题在真正的应用程序中永远不会发生,并且只有在单元测试期间我才能忍受它. 谢谢您的帮助!
我昨天尝试测试自己的DependencyProperty创建类时遇到了类似的问题.我遇到了这个问题,并注意到取消注册依赖项属性没有真正的解决方案.所以我用
Red Gate .NET Reflector做了一些挖掘,看看我能想出什么.
查看DependencyProperty.Register重载,它们似乎都指向DependencyProperty.RegisterCommon.该方法有两个部分: 首先检查房产是否已经注册 FromNameKey key = new FromNameKey(name,ownerType); lock (Synchronized) { if (PropertyFromName.Contains(key)) { throw new ArgumentException(SR.Get("PropertyAlreadyRegistered",new object[] { name,ownerType.Name })); } } 第二,注册DependencyProperty DependencyProperty dp = new DependencyProperty(name,propertyType,ownerType,defaultMetadata,validateValueCallback); defaultMetadata.Seal(dp,null); //...Yada yada... lock (Synchronized) { PropertyFromName[key] = dp; } 两个部分都围绕着DependencyProperty.PropertyFromName,一个HashTable.我还注意到DependencyProperty.RegisteredPropertyList,ItemStructList< DependencyProperty>但还没有看到它在哪里使用.但是,为了安全起见,我想如果可能的话,我也会尝试将其删除. 所以我结束了以下代码,允许我“取消注册”依赖属性. private void RemoveDependency(DependencyProperty prop) { var registeredPropertyField = typeof(DependencyProperty). GetField("RegisteredPropertyList",BindingFlags.NonPublic | BindingFlags.Static); object list = registeredPropertyField.GetValue(null); var genericMeth = list.GetType().GetMethod("Remove"); try { genericMeth.Invoke(list,new[] { prop }); } catch (TargetInvocationException) { Console.WriteLine("Does not exist in list"); } var propertyFromNameField = typeof(DependencyProperty). GetField("PropertyFromName",BindingFlags.NonPublic | BindingFlags.Static); var propertyFromName = (Hashtable)propertyFromNameField.GetValue(null); object keyToRemove = null; foreach (DictionaryEntry item in propertyFromName) { if (item.Value == prop) keyToRemove = item.Key; } if (keyToRemove != null) propertyFromName.Remove(keyToRemove); } 它运行良好,我可以运行我的测试,而不会得到“AlreadyRegistered”异常.但是,我强烈建议您不要在任何类型的生产代码中使用它.可能有一个原因,MSFT选择不采用正式方式取消注册依赖属性,并且试图反对它只是在寻找麻烦. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- #小练习 正则表达式匹配邮箱名称
- 如何在全屏(狮子)Xcode 4.1上运行iPhone模拟器?
- XML Schema:为什么不能有孩子?这怎么可以绕过?
- c# – DbSet.Add&DbSet.Remove使用EntityState.Added和
- Cocos2d-x ListView 的添加,删除,点击和滑动到头和尾监听
- macos – PostgreSQL:找不到命令
- VC错误——error LNK1123: failure during conversion
- C#应用程序 – 降低CPU使用率
- JSONObject简介
- c# – “无法在Azure Web应用程序中创建SSL / TLS安全通道”