using System; using System.Collections.Generic; using System.Reflection; using System.Text; using Rmake.API.Interfaces; using Rmake.API.Realizations.Engines.Processors; using Rmake.Framework.Logging; using Rmake.Model; using Rmake.Model.Processable.Orders; namespace Rmake.API.Realizations.Engines { public class ProcessorSelector { public Processor SelectProcessor(Order order, IEngineAPI engineAPI) { try { if (order == null) { Logger.Error("The parameter [order] is null. "); return null; } Type orderType = order.GetType(); if (orderType.Name.EndsWith("Order")) { String orderName = orderType.Name.Substring(0, orderType.Name.Length - 5); String processorName = "Rmake.API.Realizations.Engines.Processors." + orderName + "Processor"; Type processorType = GetType(processorName); if (processorType == null) { Logger.Error(processorName + " is not exist. "); return null; } Object[] parameters = new Object[1]; parameters[0] = engineAPI; Object createdInstance = CreateNewInstance(processorType, parameters); if (createdInstance is Processor) { return (Processor) createdInstance; } } } catch (Exception ex) { Logger.Fatal(ex); } return null; } private Object CreateNewInstance(Type type, Object[] parameters) { try { if (type == null) { Logger.Error("The parameter [Type type] is null. "); return null; } ConstructorInfo[] constructorInfos = type.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); ConstructorInfo cInfo = null; foreach (ConstructorInfo item in constructorInfos) { if (item.GetParameters().Length == parameters.Length) { if (item.GetParameters()[0].ParameterType.Equals(typeof(IEngineAPI))) { cInfo = item; break; } } } if (cInfo == null) { Logger.Error("Cannot find constructor. TypeName: " + type.FullName); return null; } // Constructor の実行 return cInfo.Invoke(parameters); } catch (Exception ex) { Logger.Fatal(ex); } return null; } public Type GetType(String typeName) { foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { Type type = assembly.GetType(typeName); if (type != null) { return type; } } return null; } } }