using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using WCS.Core.BaseExtensions;
namespace WCS.Core.Helpers
{
///
/// 反射辅助类
///
public class ReflectionHelper
{
///
/// 创建指定类型的实例
///
///
///
///
public static TModel CreateInstance(Type type) => (TModel)ReflectionHelper.CreateInstance(type);
///
/// 创建指定类型的实例
///
///
///
public static object CreateInstance(Type type) => Activator.CreateInstance(type);
///
/// 从当前程序中 获取所有实现指定接口的类型
///
///
///
public static List GetTypesByImplementInterface() where TInterface : class => GetAssemblies().SelectMany(GetTypesByImplementInterface).ToList();
///
/// 从指定的程序集里 获取所有实现指定接口的类型
///
///
///
///
public static List GetTypesByImplementInterface(Assembly assembly) where TInterface : class
{
try
{
return assembly.GetTypes() //获取该程序集中所有的类
.Where(type => !string.IsNullOrWhiteSpace(type.Namespace))//命名空间不为空
.Where(type => type.GetTypeInfo().IsClass) //必须要有类
.Where(type => type.GetTypeInfo().BaseType != null)//基本类型不为空
.Where(type => !type.GetTypeInfo().IsAbstract) //没有作废弃用
// IsAssignableFrom
// 方法的作用
// a对象所对应类信息是b对象所对应的类信息的父类或者是父接口,简单理解即a是b的父类或接口 a对象所对应类信息与b对象所对应的类信息相同,简单理解即a和b为同一个类或同一个接口
.Where(type => typeof(TInterface).IsAssignableFrom(type))// 当前类是否继承或指定接口
.ToList();
}
catch
{
return new List();
}
}
///
/// 从指定的程序集里 获取所有实现指定接口的类型
///
///
///
///
public static List GetTypesByImplementInterface(List assemblies) where TInterface : class
{
try
{
List types = new List();
assemblies.ForEach(p =>
{
types.AddRange(p.GetTypes() //获取该程序集中所有的类
.Where(type => !string.IsNullOrWhiteSpace(type.Namespace))//命名空间不为空
.Where(type => type.GetTypeInfo().IsClass) //必须要有类
.Where(type => type.GetTypeInfo().BaseType != null)//基本类型不为空
.Where(type => !type.GetTypeInfo().IsAbstract) //没有作废弃用
// IsAssignableFrom
// 方法的作用
// a对象所对应类信息是b对象所对应的类信息的父类或者是父接口,简单理解即a是b的父类或接口 a对象所对应类信息与b对象所对应的类信息相同,简单理解即a和b为同一个类或同一个接口
.Where(type => typeof(TInterface).IsAssignableFrom(type))// 当前类是否继承或指定接口
.ToList());
});
return types;
}
catch
{
return new List();
}
}
///
/// 获取项目中所有程序集 (注意,排除了一些指定的程序集)
///
/// AppContext.BaseDirectory 方法的作用是获取程序所在目录
///
public static List GetAssemblies()
{
var assemblies = new List();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
assembly.GetReferencedAssemblies().RemoveTheAssemblyNamespecified().ToList()
.ForEach(p =>
{
try
{
assemblies.Add(Assembly.Load(p));
}
catch (Exception ex)
{
Log(" 警告! 加载程序集失败:" + p.FullName);
Log(" 错误: " + ex.Message);
}
});
}
assemblies.AddRange(GetAssemblies(AppContext.BaseDirectory));
return assemblies.RemoveDuplicateAssemblies().ToList();
}
///
/// 从指定的目录开始,提取所有可用的程序集,向上查找引用的
///
///
///
public static List GetAssemblies(string path)
{
var source = new List(); //需要返回的数据集合
foreach (var file in Directory.GetFiles(path, "*.dll"))//读取指定目录中所有的DLL文件路径,并遍历
{
//try
//{
var a = Assembly.GetEntryAssembly();
var assembly = Assembly.LoadFrom(file); //将获取到的程序集加载出来
source.Add(assembly); //将该程序集加入到需要返回的数据中
//找到所有引用过这个程序集的程序集的名称,并进行遍历
assembly.GetReferencedAssemblies().RemoveTheAssemblyNamespecified().ToList()
.ForEach(p =>
{
try
{
source.Add(Assembly.Load(p));
}
catch (Exception ex)
{
Log(" 警告! 加载程序集失败:" + p.FullName);
Log(" 错误: " + ex.Message);
}
});
//}
//catch (Exception ex)
//{
// Log(" 警告! 提取程序集失败:" + file);
// Log(" 错误: " + ex.Message);
//}
}
return source.DistinctBy(p => p.FullName).ToList();
}
///
/// 写日志
///
/// 日志内容
private static void Log(string _)
{
}
}
}