原理是根据反射获取到对应方法的服务类的类型,通过方法的Invoke方法调用其它方法。
相当于中转站,提供服务类名称、方法名称、参数对象的Json格式字符串,调用对应的方法。
主要代码:
/// <summary> /// 根据参数获取方法返回集合 /// </summary> /// <param name="dataSourceSettingsList">参数集合</param> /// <returns>返回对象集合</returns> public List<object> GetDataSourceList(List<DataServiceJson> dataSourceSettingsList) { List<object> result = new List<object>(); foreach (DataServiceJson dataSourceSettings in dataSourceSettingsList) { result.Add(GetDataSource(dataSourceSettings)); } return result; } private object GetDataSource(DataServiceJson dataSourceSettings) { try { object result = null; if (dataSourceSettings != null) { if (!string.IsNullOrEmpty(dataSourceSettings.ServiceName) && !string.IsNullOrEmpty(dataSourceSettings.HandlerMethod)) { result = call(dataSourceSettings.ServiceName, dataSourceSettings.HandlerMethod, dataSourceSettings.parameterDataJsonString); } } return result; } catch (Exception ex) { throw ex; } } private object call(string serviceName, string methodName, string parameterDataJsonString) { string serviceFullName = string.Format("BLL.Service.{0}{1}", serviceName, "Service"); Type type = Type.GetType(serviceFullName); MethodInfo methodInfo = type.GetMethod(methodName); Dictionary<string, object> keyValue = JsonConvertHelper.DeserializeObject<Dictionary<string, object>>(parameterDataJsonString); ParameterInfo[] parameterArray = methodInfo.GetParameters(); object[] objectArray = new object[parameterArray.Length]; for (int i = 0; i < parameterArray.Length; i++) { if (keyValue != null && keyValue.ContainsKey(parameterArray[i].Name)) { objectArray[i] = JsonConvertHelper.DeserializeObject(keyValue[parameterArray[i].Name], parameterArray[i].ParameterType); } } object serviceInstance = Activator.CreateInstance(type); if (serviceInstance != null) { return methodInfo.Invoke(serviceInstance, objectArray); } else { throw new Exception("方法不存在!"); } }
其中的参数对象DataServiceJson:
public class DataServiceJson { /// <summary> /// 服务类名 /// </summary> public string ServiceName { get; set; } /// <summary> /// 方法名 /// </summary> public string HandlerMethod { get; set; } /// <summary> /// 参数Json格式 /// </summary> public string parameterDataJsonString { get; set; } }
JsonConvertHelper帮助类放在另一个随笔