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)
在.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)
| 归档时间: |
|
| 查看次数: |
10724 次 |
| 最近记录: |