代码之家  ›  专栏  ›  技术社区  ›  Yes - that Jake.

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

  •  4
  • Yes - that Jake.  · 技术社区  · 17 年前

    下面的代码在字符串和 IMY公司设置

        public static List<IMyCompanyProductSetting> GetProductSettings(ConfigurationManager cfm)
        {
            List<IMyCompanyProductSetting> ret = new List<IMyCompanyProductSetting>();
            foreach(IMyCompanySetting setting in cfm.Values)
            {
                try
                {
                    IMyCompanyProductSetting prod = (IMyCompanyProductSetting)setting;
                    ret.Add(prod);
    
                }
                catch
                {
                  // Do nothing.
                }
            }
            return ret;
        }
    

    有什么更好的方法可以做到这一点?

    5 回复  |  直到 17 年前
        1
  •  14
  •   Mehrdad Afshari    5 年前

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

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

    if (setting is IMyCompanyProductSetting) {
      ...
    }
    

    或者,您可以使用 as 关键字,该关键字尝试强制转换对象,如果失败,它将返回,而不是引发异常 null

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

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

    过滤 IEnumerable 按类型(LINQy):

    正如Jon Skeet指出的,您应该使用 OfType 用于轻松筛选序列的扩展方法(假设您获得LINQ):

    var filteredSequence = sequence.OfType<TargetType>();
    

    铸造 数不清 要键入(LINQy):

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

    var castedSequence = sequence.Cast<TargetType>();
    
        2
  •  7
  •   Community Mohan Dere    8 年前

    “困难”的方法(预LINQ)是使用“as”。这比每次使用“是”然后强制转换更有效(因为“是”和强制转换都需要执行时间检查):

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

    看见 another question

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

    return cfm.Values.OfType<IMyCompanyProductSetting>().ToList();
    

    很简单:)

        3
  •  2
  •   John Saunders    17 年前

        4
  •  1
  •   James    17 年前

    对于更简洁、更不容易出错的代码,应该使用“Is”语句。请参见下面的示例。

     if (setting Is IMyCompanyProductSetting)
      ret.add((IMyCompanyProductSetting)setting);
    
        5
  •  1
  •   Henk Holterman    17 年前

    或者

    if (setting is IMyCompanyProductSetting)
    {
      IMyCompanyProductSetting prod = (IMyCompanyProductSetting)setting;
    }
    

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