当前位置:  开发笔记 > 编程语言 > 正文

从类/接口检查继承的正确方法是什么?

如何解决《从类/接口检查继承的正确方法是什么?》经验,为你挑选了2个好方法。

下面的代码循环遍历字符串字典和IMyCompanySettings,寻找实现IMyCompanyProductSetting的值.显然,尝试强制转换异常是一种非常昂贵的方法.

    public static List GetProductSettings(ConfigurationManager cfm)
    {
        List ret = new List();
        foreach(IMyCompanySetting setting in cfm.Values)
        {
            try
            {
                IMyCompanyProductSetting prod = (IMyCompanyProductSetting)setting;
                ret.Add(prod);

            }
            catch
            {
              // Do nothing.
            }
        }
        return ret;
    }

有什么更好的方法呢?



1> Mehrdad Afsh..:

铸造101 [铸造材料的一般信息]:

使用[object] is [interface/class]表达式:

if (setting is IMyCompanyProductSetting) {
  ...
}

或者,你可以使用as试图转换对象的关键字,如果它失败,它将返回而不是抛出异常null.请注意,目标类型必须是as关键字中的引用类型:

var prod = setting as IMyCompanyProductSetting; 

if (prod != null) {
   ...
}

您应该始终使用上面的代码而不是等效的异常处理.

过滤IEnumerable类型(LINQy):

正如Jon Skeet指出的那样,您应该使用OfType扩展方法轻松过滤序列(假设您有LINQ):

var filteredSequence = sequence.OfType();

转换IEnumerable为类型(LINQy):

如果要尝试将每个元素转换为目标类型(而不是按类型过滤),则可以使用Cast扩展方法:

var castedSequence = sequence.Cast();



2> Jon Skeet..:

"硬"方式(LINQ之前)是使用"as".这比使用"is"然后每次转换(因为"是"和转换需要执行时间检查)更有效:

IMyCompanyProductSetting prod = setting as IMyCompanyProductSetting;
if (prod != null)
{
    ret.Add(prod);
}

有关何时使用"as"以及何时使用演员表,请参阅另一个问题.

但是,如果您使用的是.NET 3.5,则非常简单:

return cfm.Values.OfType().ToList();

很容易 :)

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有