public void LoadModule(Type type) { var ctor = type.GetConstructor(new[] { typeof(ICliEngine), typeof(INodeManager) }); CliModuleBase module = (CliModuleBase)ctor.Invoke(new object[] { _engine, _client }); LoadModule(module); }
private void LoadModule(CliModuleBase module) { var cliModuleAttribute = module.GetType().GetCustomAttribute <CliModuleAttribute>(); _cliConsole.WriteLine($"module ({cliModuleAttribute.ModuleName})"); ModuleNames.Add(cliModuleAttribute.ModuleName); MethodsByModules[cliModuleAttribute.ModuleName] = new List <string>(); var methods = module.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (MethodInfo methodInfo in methods.OrderBy(m => m.Name)) { var cliProperty = methodInfo.GetCustomAttribute <CliPropertyAttribute>(); var cliFunction = methodInfo.GetCustomAttribute <CliFunctionAttribute>(); bool isProperty = cliProperty != null; string objectName = cliProperty?.ObjectName ?? cliFunction?.ObjectName; string itemName = cliProperty?.PropertyName ?? cliFunction?.FunctionName; if (objectName == null) { throw new InvalidDataException($"Method {methodInfo.Name} of {module.GetType().Name} should be decorated with one of {nameof(CliPropertyAttribute)} or {nameof(CliFunctionAttribute)}"); } ObjectInstance instance; if (!_objects.ContainsKey(objectName)) { instance = _engine.JintEngine.Object.Construct(Arguments.Empty); _engine.JintEngine.SetValue(objectName, instance); _objects[objectName] = instance; } instance = _objects[objectName]; var @delegate = CreateDelegate(methodInfo, module); DelegateWrapper nativeDelegate = new DelegateWrapper(_engine.JintEngine, @delegate); if (isProperty) { _cliConsole.WriteKeyword($" {objectName}"); _cliConsole.WriteLine($".{itemName}"); MethodsByModules[objectName].Add(itemName); AddProperty(instance, itemName, nativeDelegate); } else { _cliConsole.WriteKeyword($" {objectName}"); _cliConsole.WriteLine($".{itemName}({string.Join(", ", methodInfo.GetParameters().Select(p => p.Name))})"); MethodsByModules[objectName].Add(itemName + "("); AddMethod(instance, itemName, nativeDelegate); } } _cliConsole.WriteLine(); }
// ReSharper disable once MemberCanBePrivate.Global public void LoadModule(Type type) { ConstructorInfo?ctor = type.GetConstructor(new[] { typeof(ICliEngine), typeof(INodeManager) }); if (ctor != null) { CliModuleBase module = (CliModuleBase)ctor.Invoke(new object[] { _engine, _client }); LoadModule(module); } else { _cliConsole.WriteErrorLine( $"Could not load module {type.Name} because of a missing module constructor"); } }
/// <summary> /// Can just use Delegate.CreateDelegate??? /// </summary> /// <param name="methodInfo"></param> /// <param name="module"></param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> private static Delegate CreateDelegate(MethodInfo methodInfo, CliModuleBase module) { if (methodInfo == null) { throw new ArgumentNullException(nameof(methodInfo)); } ParameterInfo[] parameterInfos = methodInfo.GetParameters(); Type[] types = new Type[parameterInfos.Length + 1]; for (int i = 0; i < parameterInfos.Length; i++) { types[i] = parameterInfos[i].ParameterType; } types[parameterInfos.Length] = methodInfo.ReturnType; return(methodInfo.CreateDelegate(Expression.GetDelegateType(types), module)); }