在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
namespace WDBuyNET.DMSFrame.Utils.Helpers { public static class ReflectionHelper { public class TypeLoadConfig { private bool copyToMemory; private bool loadAbstractType; private string targetFilePostfix; public bool CopyToMemory { get { return this.copyToMemory; } set { this.copyToMemory = value; } } public bool LoadAbstractType { get { return this.loadAbstractType; } set { this.loadAbstractType = value; } } public string TargetFilePostfix { get { return this.targetFilePostfix; } set { this.targetFilePostfix = value; } } public TypeLoadConfig() { this.copyToMemory = false; this.loadAbstractType = false; this.targetFilePostfix = ".dll"; } public TypeLoadConfig(bool copyToMem, bool loadAbstract, string postfix) { this.copyToMemory = false; this.loadAbstractType = false; this.targetFilePostfix = ".dll"; this.copyToMemory = copyToMem; this.loadAbstractType = loadAbstract; this.targetFilePostfix = postfix; } } public static void CopyProperty(object source, object target) { ReflectionHelper.CopyProperty(source, target, null); } public static void CopyProperty(object source, object target, IList<MapItem> propertyMapItemList) { Type type = source.GetType(); Type type2 = target.GetType(); PropertyInfo[] properties = type.GetProperties(); if (propertyMapItemList != null) { foreach (MapItem current in propertyMapItemList) { object property = ReflectionHelper.GetProperty(source, current.Source); ReflectionHelper.SetProperty(target, current.Target, property); } } else { PropertyInfo[] array = properties; for (int i = 0; i < array.Length; i++) { PropertyInfo propertyInfo = array[i]; if (propertyInfo.CanRead) { object property2 = ReflectionHelper.GetProperty(source, propertyInfo.Name); ReflectionHelper.SetProperty(target, propertyInfo.Name, property2); } } } } private static void DistillMethods(Type interfaceType, ref IList<MethodInfo> methodList) { MethodInfo[] methods = interfaceType.GetMethods(); for (int i = 0; i < methods.Length; i++) { MethodInfo methodInfo = methods[i]; bool flag = false; foreach (MethodInfo current in methodList) { if (current.Name == methodInfo.Name && current.ReturnType == methodInfo.ReturnType) { ParameterInfo[] parameters = current.GetParameters(); ParameterInfo[] parameters2 = methodInfo.GetParameters(); if (parameters.Length == parameters2.Length) { bool flag2 = true; for (int j = 0; j < parameters.Length; j++) { if (parameters[j].ParameterType != parameters2[j].ParameterType) { flag2 = false; } } if (flag2) { flag = true; break; } } } } if (!flag) { methodList.Add(methodInfo); } } Type[] interfaces = interfaceType.GetInterfaces(); i = 0; while (i < interfaces.Length) { Type interfaceType2 = interfaces[i]; ReflectionHelper.DistillMethods(interfaceType2, ref methodList); i++; } } public static IList<MethodInfo> GetAllMethods(params Type[] interfaceTypes) { for (int i = 0; i < interfaceTypes.Length; i++) { Type type = interfaceTypes[i]; if (!type.IsInterface) { throw new Exception("Target Type must be interface!"); } } IList<MethodInfo> result = new List<MethodInfo>(); i = 0; while (i < interfaceTypes.Length) { Type interfaceType = interfaceTypes[i]; ReflectionHelper.DistillMethods(interfaceType, ref result); i++; } return result; } public static object GetFieldValue(object obj, string fieldName) { Type type = obj.GetType(); FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField); if (field == null) { throw new Exception(string.Format("The field named '{0}' not found in '{1}'.", fieldName, type)); } return field.GetValue(obj); } public static string GetMethodFullName(MethodInfo method) { return string.Format("{0}.{1}()", method.DeclaringType, method.Name); } public static object GetProperty(object obj, string propertyName) { return obj.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, obj, null); } public static Type GetType(string typeAndAssName) { string[] array = typeAndAssName.Split(new char[] { ',' }); return (array.Length >= 2) ? ReflectionHelper.GetType(array[0].Trim(), array[1].Trim()) : Type.GetType(typeAndAssName); } public static Type GetType(string typeFullName, string assemblyName) { Type result; if (assemblyName == null) { result = Type.GetType(typeFullName); } else { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Assembly[] array = assemblies; for (int i = 0; i < array.Length; i++) { Assembly assembly = array[i]; if (assembly.FullName.Split(new char[] { ',' })[0].Trim() == assemblyName.Trim()) { result = assembly.GetType(typeFullName); return result; } } Assembly assembly2 = Assembly.Load(assemblyName); result = ((!(assembly2 != null)) ? null : assembly2.GetType(typeFullName)); } return result; } public static string GetTypeFullName(Type t) { return t.FullName + "," + t.Assembly.FullName.Split(new char[] { ',' })[0]; } public static IList<TBase> LoadDerivedInstance<TBase>(Assembly asm) { IList<TBase> list = new List<TBase>(); Type typeFromHandle = typeof(TBase); Type[] types = asm.GetTypes(); for (int i = 0; i < types.Length; i++) { Type type = types[i]; bool arg_41_0; if (typeFromHandle.IsAssignableFrom(type) && !type.IsAbstract) { arg_41_0 = type.IsInterface; } else { arg_41_0 = true; } if (!arg_41_0) { TBase item = (TBase)Activator.CreateInstance(type); list.Add(item); } } return list; } public static IList<Type> LoadDerivedType(Type baseType, string directorySearched, bool searchChildFolder, ReflectionHelper.TypeLoadConfig config) { if (config == null) { config = new ReflectionHelper.TypeLoadConfig(); } IList<Type> list = new List<Type>(); IList<Type> result; if (searchChildFolder) { ReflectionHelper.LoadDerivedTypeInAllFolder(baseType, list, directorySearched, config); result = list; } else { ReflectionHelper.LoadDerivedTypeInOneFolder(baseType, list, directorySearched, config); result = list; } return result; } private static void LoadDerivedTypeInAllFolder(Type baseType, IList<Type> derivedTypeList, string folderPath, ReflectionHelper.TypeLoadConfig config) { ReflectionHelper.LoadDerivedTypeInOneFolder(baseType, derivedTypeList, folderPath, config); string[] directories = Directory.GetDirectories(folderPath); if (directories != null) { string[] array = directories; for (int i = 0; i < array.Length; i++) { string folderPath2 = array[i]; ReflectionHelper.LoadDerivedTypeInAllFolder(baseType, derivedTypeList, folderPath2, config); } } } private static void LoadDerivedTypeInOneFolder(Type baseType, IList<Type> derivedTypeList, string folderPath, ReflectionHelper.TypeLoadConfig config) { string[] files = Directory.GetFiles(folderPath); string[] array = files; for (int i = 0; i < array.Length; i++) { string text = array[i]; if (config.TargetFilePostfix == null || text.EndsWith(config.TargetFilePostfix)) { Assembly assembly = null; try { assembly = ((!config.CopyToMemory) ? Assembly.LoadFrom(text) : Assembly.Load(FileHelper.ReadFileReturnBytes(text))); } catch (Exception ) { } if (assembly != null) { Type[] types = assembly.GetTypes(); Type[] array2 = types; for (int j = 0; j < array2.Length; j++) { Type type = array2[j]; bool arg_C5_0; if (type.IsSubclassOf(baseType) || baseType.IsAssignableFrom(type)) { arg_C5_0 = (!config.LoadAbstractType && type.IsAbstract); } else { arg_C5_0 = true; } if (!arg_C5_0) { derivedTypeList.Add(type); } } } } } } public static MethodInfo SearchGenericMethodInType(Type originType, string methodName, Type[] argTypes) { MethodInfo[] methods = originType.GetMethods(); MethodInfo result; for (int i = 0; i < methods.Length; i++) { MethodInfo methodInfo = methods[i]; if (methodInfo.ContainsGenericParameters && methodInfo.Name == methodName) { bool flag = true; ParameterInfo[] parameters = methodInfo.GetParameters(); if (parameters.Length == argTypes.Length) { for (int j = 0; j < parameters.Length; j++) { if (!parameters[j].ParameterType.IsGenericParameter) { if (parameters[j].ParameterType.IsGenericType) { if (parameters[j].ParameterType.GetGenericTypeDefinition() != argTypes[j].GetGenericTypeDefinition()) { flag = false; break; } } else { if (parameters[j].ParameterType != argTypes[j]) { flag = false; break; } } } } if (flag) { result = methodInfo; return result; } } } } result = null; return result; } public static MethodInfo SearchMethod(Type originType, string methodName, Type[] argTypes) { MethodInfo method = originType.GetMethod(methodName, argTypes); MethodInfo result; if (method != null) { result = method; } else { MethodInfo methodInfo = ReflectionHelper.SearchGenericMethodInType(originType, methodName, argTypes); if (methodInfo != null) { result = methodInfo; } else { Type baseType = originType.BaseType; if (baseType != null) { while (baseType != typeof(object)) { MethodInfo method2 = baseType.GetMethod(methodName, argTypes); if (method2 != null) { result = method2; return result; } MethodInfo methodInfo2 = ReflectionHelper.SearchGenericMethodInType(baseType, methodName, argTypes); if (methodInfo2 != null) { result = methodInfo2; return result; } baseType = baseType.BaseType; } } if (originType.GetInterfaces() != null) { IList<MethodInfo> allMethods = ReflectionHelper.GetAllMethods(originType.GetInterfaces()); foreach (MethodInfo current in allMethods) { if (!(current.Name != methodName)) { ParameterInfo[] parameters = current.GetParameters(); if (parameters.Length == argTypes.Length) { bool flag = true; for (int i = 0; i < parameters.Length; i++) { if (parameters[i].ParameterType != argTypes[i]) { flag = false; break; } } if (flag) { result = current; return result; } } } } } result = null; } } return result; } public static void SetFieldValue(object obj, string fieldName, object val) { Type type = obj.GetType(); FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetField); if (field == null) { throw new Exception(string.Format("The field named '{0}' not found in '{1}'.", fieldName, type)); } field.SetValue(obj, val); } public static void SetProperty(IList<object> objs, string propertyName, object proValue) { object[] array = new object[] { proValue }; foreach (object current in objs) { ReflectionHelper.SetProperty(current, propertyName, proValue); } } public static void SetProperty(object obj, string propertyName, object proValue) { ReflectionHelper.SetProperty(obj, propertyName, proValue, true); } public static void SetProperty(object obj, string propertyName, object proValue, bool ignoreError) { Type type = obj.GetType(); PropertyInfo property = type.GetProperty(propertyName); if (!(property != null) || !property.CanWrite) { if (!ignoreError) { throw new Exception(string.Format("The setter of property named '{0}' not found in '{1}'.", propertyName, type)); } } else { try { proValue = TypeHelper.ChangeType(property.PropertyType, proValue); } catch (object ) { } object[] args = new object[] { proValue }; type.InvokeMember(propertyName, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, null, obj, args); } } public static object DllInvoke(string DllFileName, string NameSpace, string ClassName, string MethodName, params object[] ObjArrayParams) { object result; try { Assembly assembly = Assembly.LoadFrom(DllFileName); Type[] types = assembly.GetTypes(); Type[] array = types; for (int i = 0; i < array.Length; i++) { Type type = array[i]; if (type.Namespace == NameSpace && type.Name == ClassName) { MethodInfo method = type.GetMethod(MethodName); if (method != null) { object obj = Activator.CreateInstance(type); result = method.Invoke(obj, ObjArrayParams); return result; } } } } catch (Exception ) { } result = 0; return result; } } } |
请发表评论