c# – 我应该如何重构一连串的try-and-catch-wrapped投机 *** 作

c# – 我应该如何重构一连串的try-and-catch-wrapped投机 *** 作,第1张

概述我有一些C#代码使用.NET框架中的Xml.Schema类来处理 XML模式.各种简单类型限制在框架中被抽象为从Xml.Schema.XmlSchemaFacet派生的一大堆类.除非有一些我错过的东西,否则知道给定方面的哪个派生方面类型的唯一方法是推测性地将其转换为其中一个,在失败的情况下捕获结果的InvalidCastOperation.这样做会让我有一个非常难看的功能: private voi 我有一些C#代码使用.NET框架中的Xml.Schema类来处理 XML模式.各种简单类型限制在框架中被抽象为从Xml.Schema.XmlSchemaFacet派生的一大堆类.除非有一些我错过的东西,否则知道给定方面的哪个派生方面类型的唯一方法是推测性地将其转换为其中一个,在失败的情况下捕获结果的InvalIDCastoperation.这样做会让我有一个非常难看的功能:

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投机 *** 作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存