如何获取实现IMyInterface的引用中的所有类型

时间:2011-08-29 21:17:58

标签: c# .net reflection

我有一个项目包含很多参考文献 我需要找到实现IMyInterface接口的所有类型。

我尝试了AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()),但它没有返回引用中的所有类型。

我该怎么做?

3 个答案:

答案 0 :(得分:5)

我想问题可能是你当前没有加载一些引用的程序集。您可以使用GetReferencedAssemblies获取所有引用的程序集 - 但这只会产生名称。

如果您愿意,可以继续使用Assembly.Load加载程序集并进一步检查它们。

所以可能的代码段应该是

    var types =
        System.Reflection.Assembly.GetExecutingAssembly()
            .GetReferencedAssemblies()
            .SelectMany(name => Assembly.Load(name).GetTypes())
            .Union(AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()));

搜索实现您的界面的类型:

    var withInterfaces =
        types.Where(t => t.GetInterfaces().Any(i => i == typeof(IDisposable)));

如果这不是我失去的伎俩......

答案 1 :(得分:0)

using System;
using System.Linq;
using System.Reflection;

// try this for fun:
using IMyInterface=System.Collections.IEnumerable;

namespace TestThat
{
    class MainClass
    {

        public static void Main (string[] args)
        {
            var x = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(a => a.GetTypes())
                .Where(t => typeof(IMyInterface).IsAssignableFrom(t))
                .Where(t => !(t.IsAbstract || t.IsInterface))
                .Except(new [] { typeof(IMyInterface) });

            Console.WriteLine(string.Join("\n", x.Select(y=>y.Name).ToArray()));

        }
    }
}

如果要查找派生类并想要“跳过”基类:

            .Except(new [] { typeof(MyBaseClass) });

有你的界面检测。我会看看为什么你没有得到所有类型的参考。我希望你的代码可以做到这一点,Brb。

答案 2 :(得分:0)

您是否尝试在运行时执行此操作?

如果您只需要一般地了解这些信息,并且不必在运行时,您可以在Visual Studio中加载解决方案,然后右键单击接口IName中接口的名称{line,然后选择“查找所有引用” - 这应该显示代码中对接口的所有引用。

如果这是你在运行时真正需要的东西,那么请看上面的答案。