【问题标题】:Search for which classes implement which interfaces搜索哪些类实现了哪些接口
【发布时间】:2014-01-02 19:50:02
【问题描述】:

我看到了以编程方式搜索程序集中所有类型的信息,以确定哪些类实现了哪些接口或从哪些基类继承。但是当您浏览 msdn(例如 Stream 类)时,它们会为您呈现一个漂亮的继承层次结构图,您可以点击查看其他类继承自它。

但接口似乎不存在相同的功能。

这是一个普遍的问题。我可以很容易地找到从特定父类继承的所有类......但是有没有办法用接口做到这一点?除了编写程序来搜索所有程序集之外?我正在寻找一种方法来搜索所有实现特定接口的类...

【问题讨论】:

  • 解决你的XY Problemnew ReadOnlyCollection(colection1.Concat(collection2).ToList())。请注意,如果 collection1collection2 被修改,它将不会反映在结果集合中。如果您希望它反映您将需要一个自定义类的更改,那么 .NET 框架中没有任何东西可以为您做这件事。 (如果您不明白如何让班级提出新问题,我们可以帮助您)
  • @ScottChamberlain 谢谢,回答了问题的具体部分。我已经删除了问题的特定部分,只是将问题保留为一般性问题,“我如何搜索哪些类实现了 ___ 接口。”

标签: c# inheritance interface


【解决方案1】:

How do you find all implementations of an interface?

为了解决您的问题,您可以这样做

 IEnumerables.ToList()

【讨论】:

  • 感谢您提及其他问题,但答案是“购买 resharper”......我认为这不是一个好的答案(但很高兴知道。)
  • 或者您可以查看第二个响应,即“您可以右键单击方法名称(接口中的定义或其他类中的实现)并选择查看调用层次结构。在调用层次结构窗口中有“实现" 文件夹,您可以在其中找到接口方法实现的所有位置。"
  • 再次感谢,但例如,如果我创建一个 Stream 对象,并查看 Read 方法的调用层次结构,我只能找到名为 Read 的地方。这很有用,有时可能会帮助您找到一个实现 Stream 的类,您还不知道,但绝不会搜索所有内容,除非您添加对所有 .Net 中每个程序集的引用。这很有帮助,但绝对不是问题的完整答案。
  • 哦-抱歉-我忘了提。在我的调用层次结构窗口中,没有“implements”文件夹。只有“Calls to Read”和“Calls from Read”和“Overrides Read”在某些情况下可能会帮助您在当前空间中找到您要查找的内容。但是您必须在 .Net 中添加对每个程序集的引用,这样它才能成为一个广泛有用的搜索。
【解决方案2】:

代码:

IEnumerables.ToList()

谷歌:

 ILIST C#  

您将获得包含以下信息的链接:

[SerializableAttribute]  
[ComVisibleAttribute(true)]
public class ArrayList : IList, ICollection, 
    IEnumerable, ICloneable

可以看到IList,页面底部还有其他列表的链接。

【讨论】:

  • @T McKeown 什么是 IEnumerables?我在任何地方都没有看到。另外,当我用谷歌搜索 IList C# 时,我只是想出了我所期望的所有正常的东西,包括 IList 接口等。你在说什么?
【解决方案3】:

Visual Studio 中的 CTRL + ALT + J 将打开对象浏览器。

搜索您的类型,例如“IEnumerable”。

扩展类型。展开“派生类型”。

这可能无法为您提供一切,但它是一个开始的地方。

(至少 VS 2012 PREMIUM)

【讨论】:

  • 我不知道这是因为我使用的是 VS 2013 PRO,还是因为其他原因,但我不明白你在说什么。同样,您的评论使我找到了这个:msdn.microsoft.com/en-us/library/w82x6b1s(v=vs.90).aspx 基本上和您说的一样,但我仍然只看到基本类型,而不是派生类型。
  • 是的,我也不记得在以前的专业版中看到过它。不过,这是一个不错的功能。我同意需要一些简单的方法来查询这个,因为有些方法需要一个接口,而且很难判断哪些默认的 .net 实现可用。
【解决方案4】:

类似这样的:

  public static class TypeExtension
    {
        public static IEnumerable<Type> GetInterfaces(this Type type)
        {
            foreach (var intf in type.GetInterfaces())
            {
                yield return intf;

                foreach (var x in intf.GetInterfaces())
                    yield return x;
            }
        }
    }  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多