private voID NavigateFacet(XmlSchemaFacet facet){ try { handler.Length((XmlSchemaLengthFacet)facet); } catch(InvalIDCastException) { try { handler.MinLength((XmlSchemaMinLengthFacet)facet); } catch(InvalIDCastException) { try { handler.MaxLength((XmlSchemaMaxLengthFacet)facet); } catch(InvalIDCastException) { ... } } }}
我认为必须有更优雅的方法来做到这一点;要么使用我从.NET框架中遗漏的一些属性,要么使用一些聪明的OO技巧.任何人都可以开导我吗?
解决方法 因为我更喜欢将数据调试到调试代码,所以我会这样做,特别是如果代码必须处理所有XmlSchemaFacet子类:Dictionary<Type,Action<XmlSchemaFacet>> HandlerMap = new Dictionary<Type,Action<XmlSchemaFacet>>{ {typeof(XmlSchemaLengthFacet),handler.Length},{typeof(XmlSchemaMinLengthFacet),handler.MinLength},{typeof(XmlSchemaMaxLengthFacet),handler.MaxLength}};HandlerMap[facet.GetType()](facet);
如果facet不是已知类型,则会抛出KeyNotFoundException.请注意,所有处理程序方法都必须从XmlSchemaFacet转换其参数,因此您可能不会保存代码的总行数,但您肯定会节省代码中的路径数.
还有一点(假设地图是预先构建的)将映射类型映射到带有字典的方法将比遍历线性类型列表更快,这实质上是使用一堆if块获取的.
总结以上是内存溢出为你收集整理的c# – 我应该如何重构一连串的try-and-catch-wrapped投机 *** 作全部内容,希望文章能够帮你解决c# – 我应该如何重构一连串的try-and-catch-wrapped投机 *** 作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)