我有一个项目包含很多参考文献 我需要找到实现IMyInterface接口的所有类型。
我尝试了AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes())
,但它没有返回引用中的所有类型。
我该怎么做?
答案 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,然后选择“查找所有引用” - 这应该显示代码中对接口的所有引用。
如果这是你在运行时真正需要的东西,那么请看上面的答案。