using Newtonsoft.Json;
using System;
using System.Linq;
using System.Reflection;
namespace WWPipeLine.Commons
{
///
/// 动态库反射
///
public class ReflectionHelper
{
///
/// 反射静态方法调用
///
/// DLL的存放路径
/// 类名
/// 方法名
/// 方法参数列表
///
public static object GetStaticMethodObj(string dllFileName, string className, string methodName, object[] parameters)
{
Assembly assembly = Assembly.LoadFrom(dllFileName);
if (assembly == null)
{
return null;
}
Type getType = assembly.GetType(className);
if (getType == null)
{
return null;
}
MethodInfo methodInfo = getType.GetMethod(methodName);
if (methodInfo == null)
{
return null;
}
return methodInfo.Invoke(null, parameters);
}
///
///
///
/// DLL的存放路径
/// 类名
/// 单例名称
/// 方法名
/// 参数列表
///
public static object GetSignleMethodObj(string dllFileName, string className, string singleName, string methodName, object[] parameters)
{
Assembly assembly = Assembly.LoadFrom(dllFileName);
if (assembly == null)
{
return null;
}
Type type = assembly.GetType(className);
if (type == null)
{
return null;
}
PropertyInfo info = type.GetProperty(singleName);
if (info == null)
{
return null;
}
object obj = info.GetValue(null, null);
if (obj == null)
{
return null;
}
return ExecutionMethod(obj, type, methodName, parameters);
}
///
/// 普通类反射调用方法
///
/// 库名
/// 类名
/// 方法名称
/// 参数
///
public static object GetComMethodObj(string dllFileName, string className, string methodName, object[] parameters)
{
Assembly assembly = Assembly.LoadFrom(dllFileName);
if (assembly == null)
{
return null;
}
object obj = assembly.CreateInstance(className);
if (obj == null)
{
return null;
}
Type type = obj.GetType();
if (type == null)
{
return null;
}
return ExecutionMethod(obj, type, methodName, parameters);
}
///
/// 已知对象,执行相应的函数
///
/// 执行对象
/// 执行对象对应的类型
/// 执行对象的需要执行的函数
/// 参数
///
public static object ExecutionMethod(object executionObj, Type type, string methodName, object[] parameters)
{
if (type == null)
{
return null;
}
//MethodInfo info = type.GetMethod.GetMethod(methodName);
MethodInfo mathodGetAll = null;
var mAll = type.GetMethods();
var mInfos = mAll.Where(f => f.Name == methodName);
if (mInfos.Count() == 1)
{
mathodGetAll = mInfos.First();
}
else
{
if (mAll != null && mAll.Any())
{
mathodGetAll = mAll.FirstOrDefault(f => f.Name == methodName && f.GetParameters().Count() == parameters?.Count());
}
}
if (mathodGetAll == null)
{
return null;
}
var temParameters = mathodGetAll.GetParameters();
object[] objectParamList = null;
Type[] typeArray;
if (mathodGetAll.GetParameters().Length > 0)
{
if (parameters == null)
{
parameters = new object[0];
}
typeArray = new Type[temParameters.Length];
ParameterInfo[] infoArray3 = mathodGetAll.GetParameters();
object[] objArray2 = new object[infoArray3.Length];
for (int i = 0; i < infoArray3.Length; i++)
{
if (i > parameters.Length - 1)
{
objArray2.SetValue(infoArray3[i].DefaultValue, i);
}
else if (parameters[i] == null)
{
objArray2.SetValue(parameters[i], i);
}
else
{
if (infoArray3[i].ParameterType.Name == "Object")
{
objArray2.SetValue(parameters[i], i);
typeArray.SetValue(infoArray3[i].ParameterType, i);
}
else
{
JsonSerializer serializer = new JsonSerializer();
string s = SerializeHelper.JsonHepler.Json_SerializeObject(parameters[i], true);
var temPtype = parameters[i].GetType();
object obj4 = serializer.Deserialize(new JsonTextReader(new System.IO.StringReader(s)), infoArray3[i].ParameterType.IsClass ? (infoArray3[i].ParameterType.Name == temPtype.Name ? infoArray3[i].ParameterType : temPtype) : infoArray3[i].ParameterType);
objArray2.SetValue(obj4, i);
if (obj4 != null)
{
typeArray.SetValue(infoArray3[i].ParameterType, i);
}
}
}
}
objectParamList = objArray2;
}
object infoDatas = null;
try
{
return infoDatas = mathodGetAll.Invoke(executionObj, objectParamList);
}
catch (Exception ex)
{
if (ex.InnerException != null)
{
if (ex.InnerException.Message.Contains("System.ServiceModel.Channels.ServiceChannel"))
{
throw new Exception("WCF服务无法连接!", ex);
}
if (ex.InnerException.Message.Contains("Connection open error"))
{
throw new Exception("数据库连接失败!", ex);
}
}
LogHelper.Error(ex); return null;
}
}
///
/// 创建类对象
///
/// 库名
/// 类名
///
public static object GetObjectFromDLL(string dllFileName, string className)
{
Assembly assembly = Assembly.LoadFrom(dllFileName);
if (assembly == null)
{
return null;
}
return assembly.CreateInstance(className);
}
}
}