代码之家  ›  专栏  ›  技术社区  ›  caesay

找到类是否继承接口的更有效方法?

  •  1
  • caesay  · 技术社区  · 14 年前

    在C中,目前我正在执行以下代码以筛选从传递给方法的captureType继承的一组特定类。

        public static CaptureType[] ListPluginsWith<CaptureType>()
        {
            List<CaptureType> plugins = new List<CaptureType>();
            foreach (var plugin in Bot.AutoPlugins)
            {
                CaptureType plug;
                try
                {
                    if ((plug = (CaptureType)plugin.Interface) != null)
                    {
                        plugins.Add(plug);
                    }
                }
                catch
                {
                    //doesn't inherit
                }
            }
            return plugins.ToArray();
        }
    

    有没有更有效/更好/更快的方法?如果是,请告诉我:)

    3 回复  |  直到 14 年前
        1
  •  4
  •   zerkms    14 年前
    if (plugin.Interface is CaptureType)
    {
        // inherits
    }
    

    甚至

    return Bot.AutoPlugins.Where(i => i.Interface is CaptureType).ToArray();
    

    小精灵 :如果 CaptureType 强烈要求退回:

    return Bot.AutoPlugins.Where(i => i.Interface is CaptureType)
                          .Select(i => i as CaptureType)
                          .ToArray();
    

    (是的,现在看起来有点胀了,但是还有一个简洁的答案 OfType() 在这条线中,所以我不会重复它)

        2
  •  3
  •   Dean Harding    14 年前

    我实际上建议如下:

    public static IEnumerable<CaptureType> ListPluginsWith<CaptureType>()
       where CaptureType : class
    {
        foreach (var plugin in Bot.AutoPlugins)
        {
            CaptureType plug = plugin.Interface as CaptureType;
            if (plug != null)
                yield return plug;
        }
    }
    

    这有许多优点:

    1. 如果你使用 is 关键词,你基本上会做两种类型的转换(评估 x is y 基本上是一个类型转换,具有相同的性能特性),所以如果您这样做( if (x is Y) { blah = (Y)x } 你要做两个演员而不是一个 as 和A null 检查需要。
    2. 通过使用一个交互程序(即 yield return 你不需要创建一个临时的 List<CaptureType> 在内存中,将其转换为数组,然后返回数组。

    还要注意 where CaptureType : class . 自从 CaptureType 是一个接口,您可以确保它将始终通过,但为了使用 作为 关键字。如果你有一个“基础”接口,你所有的插件都能实现(例如 IPlugin 也许)然后你可以替换 其中captureType:Class 具有 where CaptureType : IPlugin 相反。

        3
  •  0
  •   Pete    14 年前

    我建议简单一点

    return Bot.AutoPlugins.Select (p => p.Interface).OfType<CaptureType> ().ToArray ();
    

    编辑:

    更重要的是,这可能比执行“Where-Then-Select”组合效率低,在我的示例中,您对每个项执行“Select”,然后按类型进行限制…