コード例 #1
0
        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);
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        // 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");
            }
        }
コード例 #4
0
        /// <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));
        }