加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 19:54:42 所属栏目:百科 来源:网络整理
导读:我有一些C#代码使用.NET框架中的Xml.Schema类来处理 XML模式.各种简单类型限制在框架中被抽象为从Xml.Schema.XmlSchemaFacet派生的一大堆类.除非有一些我错过的东西,否则知道给定方面的哪个派生方面类型的唯一方法是推测性地将其转换为其中一个,在失败的情况
我有一些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块获取的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读