获取在.NET Core中实现接口的所有类型

Mr.*_*bot 13 .net c# reflection lambda .net-core

使用反射,我如何获得在.NET Core中实现某些特定接口的所有类型?我注意到.NET 4.6中可用的方法不再可用.

例如,此代码不起作用.

var type = typeof(IMyInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));
Run Code Online (Sandbox Code Playgroud)

它抛出The name 'AppDomain' does not exist in the current context错误.

小智 16

你可以这样做:

System.Reflection.Assembly ass = System.Reflection.Assembly.GetEntryAssembly();

foreach (System.Reflection.TypeInfo ti in ass.DefinedTypes)
{
    if (ti.ImplementedInterfaces.Contains(typeof(yourInterface)))
    {
        ass.CreateInstance(ti.FullName) as yourInterface;
    }  
}
Run Code Online (Sandbox Code Playgroud)

如果你想要所有程序集中的类型,只需使用以下内容获取所有引用并再次执行上述操作:)

ass.GetReferencedAssemblies()
Run Code Online (Sandbox Code Playgroud)

  • 使用LINQ var types的简写= Assembly.GetEntryAssembly().DefinedTypes.Where(ti => ti.ImplementedInterfaces.Contains(typeof(ILogger))).选择(m => m.FullName); (2认同)

Dav*_*e S 7

在.NET Core 2.0中,您可以在编译时找到已知的程序集中的所有匹配类型(这对于动态加载的程序集不起作用),如下所示:

private static IEnumerable<Type> GetAllTypesOf<T>()
{
    var platform = Environment.OSVersion.Platform.ToString();
    var runtimeAssemblyNames = DependencyContext.Default.GetRuntimeAssemblyNames(platform);

    return runtimeAssemblyNames
        .Select(Assembly.Load)
        .SelectMany(a => a.ExportedTypes)
        .Where(t => typeof(T).IsAssignableFrom(t));
}
Run Code Online (Sandbox Code Playgroud)

这依赖于Microsoft.Extensions.DependencyModel包.


小智 5

获取所有实现类型'T'的类的完整代码

public static IEnumerable<T> GetAll<T>()
{
    var assembly = Assembly.GetEntryAssembly();
    var assemblies = assembly.GetReferencedAssemblies();

    foreach (var assemblyName in assemblies)
    {
        assembly = Assembly.Load(assemblyName);

        foreach (var ti in assembly.DefinedTypes)
        {
            if (ti.ImplementedInterfaces.Contains(typeof(T)))
            {
                yield return (T)assembly.CreateInstance(ti.FullName);
            }
        }
    }            
}
Run Code Online (Sandbox Code Playgroud)