예제 #1
0
        private static NodeReflectionData LoadMethodReflection(MethodInfo method, FuncNodeModuleAttribute moduleAttr)
        {
            var    attr           = method.GetCustomAttribute <FuncNodeAttribute>();
            string name           = attr?.name ?? ObjectNames.NicifyVariableName(method.Name);
            string returnPortName = attr?.returnName ?? "Result";

            // FuncNode.module can override FuncNodeModule.path.
            string path = attr?.module ?? moduleAttr.path;

            // FuncNode.classType can override default class type
            Type classType = attr?.classType ?? typeof(FuncNode);

            var node = new NodeReflectionData()
            {
                type    = classType,
                path    = path?.Split('/'),
                name    = name,
                tooltip = "TODO!",
                method  = method
            };

            ParameterInfo[] parameters = method.GetParameters();

            foreach (var parameter in parameters)
            {
                node.ports.Add(new PortReflectionData()
                {
                    type = parameter.IsOut ?
                           parameter.ParameterType.GetElementType() :
                           parameter.ParameterType,
                    portName  = ObjectNames.NicifyVariableName(parameter.Name),
                    fieldName = parameter.Name,
                    isMulti   = parameter.IsOut,
                    isInput   = !parameter.IsOut
                });
            }

            // Add an output port for the return value if non-void
            if (method.ReturnType != typeof(void))
            {
                node.ports.Add(new PortReflectionData()
                {
                    type      = method.ReturnType,
                    portName  = returnPortName,
                    fieldName = null,
                    isMulti   = true,
                    isInput   = false
                });
            }

            // Merge in any reflection data from the wrapper class itself
            // Specifically if it contains additional ports to include
            node.AddPortsFromClass(classType);

            return(node);
        }
예제 #2
0
        /// <summary>
        /// Extract NodeField information from class reflection + attributes
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        private static NodeReflectionData LoadClassReflection(Type type, NodeAttribute nodeAttr)
        {
            string name = nodeAttr.name ?? ObjectNames.NicifyVariableName(type.Name);
            string path = nodeAttr.module;

            var node = new NodeReflectionData()
            {
                type    = type,
                path    = path?.Split('/'),
                name    = name,
                tooltip = nodeAttr.help
            };

            node.AddPortsFromClass(type);
            return(node);
        }