如何获取实现IMyInterface的引用中的所有类型
我有一个项目包含很多参考。
我需要找到实现IMyInterface接口的所有类型。
我尝试了AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes())
但它没有返回引用中的所有类型。
我怎么做?
我想问题可能是你当前没有加载一些引用的程序集。 您可以使用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)));
如果这不是我失去的伎俩……
你试图在运行时这样做吗?
如果您只需要一般地了解这些信息,并且不必在运行时,您可以在Visual Studio中加载解决方案,然后右键单击接口IName中的接口名称{line,然后选择“查找所有引用” – 这应该显示代码中对接口的所有引用。
如果它是您在运行时真正需要的东西,那么请参阅上面的答案。
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。