/// <summary> /// 根据插件类型获取相同类型的所有插件 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="models"></param> /// <param name="Type"></param> /// <returns></returns> public static List <T> CreateInstancesByPluginType <T>(this System.Reflection.Assembly[] models, string Type = "") where T : class { if (ListObject == null) { ListObject = new Dictionary <string, object>(); } List <T> lstObject = new List <T>(); foreach (var model in models) { //System.Threading.Tasks.Parallel.ForEach(models, model => //{ var types = model.GetTypesByType(Type); if (types != null && types.Count > 0) { foreach (var type in types) { //System.Threading.Tasks.Parallel.ForEach(types, type => //{ string assemblyPluginId = model.GetAssemblyPluginAttribute().ID; PluginAttribute pluginAttribute = type.GetPluginAttribute(); string pluginId = pluginAttribute.ID; object obj = null; if (ListObject.ContainsKey(assemblyPluginId.ToLower() + pluginId.ToLower())) { obj = ListObject[assemblyPluginId.ToLower() + pluginId.ToLower()]; } if (obj != null) { lstObject.Add(obj as T); } else { obj = type.GetConstructor(new Type[] { }).Invoke(null); //obj = Activator.CreateInstance(type); lstObject.Add(obj as T); if (pluginAttribute.IsSingleInstance) { ListObject.Add(assemblyPluginId.ToLower() + pluginId.ToLower(), obj); } } //}); } } //}); } return(lstObject); }
/// <summary> /// 根据ID创建对象 /// </summary> /// <param name="models"></param> /// <param name="AssemblyId"></param> /// <param name="PluginId"></param> /// <returns></returns> public static object CreateInstanceByAssemblyIdAndPluginId(this System.Reflection.Assembly[] models, string AssemblyId, string PluginId = "") { object obj = null; if (ListObject == null) { ListObject = new Dictionary <string, object>(); } var existModel = models.GetModelByAssemblyId(AssemblyId); if (existModel != null) { if (String.IsNullOrWhiteSpace(PluginId)) { PluginId = existModel.GetAssemblyPluginAttribute().DefaultPluginID; } if (String.IsNullOrWhiteSpace(PluginId)) { return(null); } if (ListObject.ContainsKey(AssemblyId.ToLower() + PluginId.ToLower())) { obj = ListObject[AssemblyId.ToLower() + PluginId.ToLower()]; } if (obj == null) { Type existType = existModel.GetTypeByPluginId(PluginId); if (existType != null) { obj = existType.GetConstructor(new Type[] { }).Invoke(null); //obj = Activator.CreateInstance(existType); if (existType.GetPluginAttribute().IsSingleInstance) { ListObject.Add(AssemblyId.ToLower() + PluginId.ToLower(), obj); } } } } return(obj); }