示例#1
0
        public SwContextBuilder AddEntrypointMethod(MethodInfo method, SwComponentPriorityEnum priority)
        {
            if (_instances.Count > 0)
            {
                throw new InvalidOperationException("Already created");
            }

            var entrypoint = ComponentEntrypoint.Create(method, priority);

            _entrypoints.Add(entrypoint);
            return(this);
        }
示例#2
0
        private ComponentEntrypoint(MethodInfo method, Type[] imports, Type[] exports, PropertyInfo task_result_prop, FieldInfo[] tuple_fields, SwComponentPriorityEnum priority, bool is_async)
        {
            _method            = method;
            _taskResultPoperty = task_result_prop;
            _tupleFields       = tuple_fields;
            InstanceType       = method.DeclaringType;

            Import   = imports;
            Export   = exports;
            Priority = priority;
            IsAsync  = is_async;
        }
示例#3
0
        public static ComponentEntrypoint Create(MethodInfo method, SwComponentPriorityEnum priority)
        {
            var param   = method.GetParameters();
            var export  = method.ReturnType == typeof(void) ? null : method.ReturnType;
            var isAsync = export != null && (export == typeof(Task) || export.IsSubclassOf(typeof(Task)));

            export = isAsync ? export?.GenericTypeArguments?.FirstOrDefault() : export;

            var imports       = param.Select(p => p.ParameterType).ToArray();
            var isMultipleRet = export?.IsGenericType ?? false?_valueTupleTypes.Contains(export.GetGenericTypeDefinition()) : false;

            var exports = isMultipleRet ? export.GenericTypeArguments : export != null ? new[] { export } : Array.Empty <Type>();

            var resultProperty = isAsync && export != null ? typeof(Task <>).MakeGenericType(method.ReturnType.GenericTypeArguments.Single()).GetProperty("Result") : null;
            var tupleFields    = isMultipleRet ? export.GetFields() : null;

            return(new ComponentEntrypoint(method, imports, exports, resultProperty, tupleFields, priority, isAsync));
        }
示例#4
0
 public SwComponentAttribute(SwComponentPriorityEnum priority = SwComponentPriorityEnum.Medium)
 {
     Priority = priority;
 }
示例#5
0
 public SwComponentInfo(SwComponentPriorityEnum priority, IEntrypoint entrypoint)
 {
     Priority = priority;
     Init(entrypoint);
 }