// 初始化构造方法的入参
 private void AddConstructorDescription(Type classType, ClassInterfaceDescription classDescription, VariableType classKind)
 {
     if (classKind == VariableType.Struct)
     {
         AddStructDefaultConstructor(classType, classDescription);
     }
     ConstructorInfo[] constructors = classType.GetConstructors(BindingFlags.Instance | BindingFlags.Public);
     if (constructors.Length > 0)
     {
         int constructorIndex = 1;
         foreach (ConstructorInfo constructorInfo in constructors)
         {
             DescriptionAttribute descriptionAttribute = constructorInfo.GetCustomAttribute <DescriptionAttribute>();
             string descriptionStr = (null == descriptionAttribute)
                 ? string.Empty
                 : descriptionAttribute.Description;
             FunctionInterfaceDescription funcDescription = new FunctionInterfaceDescription()
             {
                 Category    = classDescription.ClassTypeDescription.Category,
                 Description = descriptionStr,
                 FuncType    = FunctionType.Constructor,
                 IsGeneric   = constructorInfo.IsGenericMethod,
                 Name        = $"{classType.Name}_Constructor{constructorIndex++}"
             };
             InitConstructorParamDescription(constructorInfo, funcDescription);
             funcDescription.Signature = ModuleUtils.GetSignature(classType.Name, funcDescription);
             classDescription.Functions.Add(funcDescription);
         }
     }
 }
        private void AddMethodDescription(Type classType, ClassInterfaceDescription classDescription)
        {
            MethodInfo[] methods  = classType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
            bool         isStatic = methods.All(item => item.IsStatic || _ignoreMethod.Contains(item.Name));

            foreach (MethodInfo methodInfo in methods)
            {
                // 忽略object对象继承方法和实例类的getset方法
                if (_ignoreMethod.Contains(methodInfo.Name))
                {
                    continue;
                }
                if (!isStatic && (methodInfo.Name.StartsWith(Constants.GetPrefix) ||
                                  methodInfo.Name.StartsWith(Constants.SetPrefix)))
                {
                    continue;
                }
                DescriptionAttribute descriptionAttribute = methodInfo.GetCustomAttribute <DescriptionAttribute>();
                string descriptionStr = (null == descriptionAttribute)
                    ? string.Empty
                    : descriptionAttribute.Description;

                TestflowCategoryAttribute categoryAttribute = methodInfo.GetCustomAttribute <TestflowCategoryAttribute>();
                string categoryStr = null == categoryAttribute
                    ? classDescription.ClassTypeDescription.Category
                    : categoryAttribute.CategoryString;

                FunctionType       funcType          = FunctionType.InstanceFunction;
                CallBackAttribute  callBackAttribute = methodInfo.GetCustomAttribute <CallBackAttribute>();
                AssertionAttribute assertAttribute   = methodInfo.GetCustomAttribute <AssertionAttribute>();
                if (null != callBackAttribute)
                {
                    funcType = FunctionType.CallBack;
                }
                else if (null != assertAttribute)
                {
                    funcType = FunctionType.Assertion;
                }
                else if (methodInfo.IsStatic)
                {
                    funcType = FunctionType.StaticFunction;
                }

                FunctionInterfaceDescription funcDescription = new FunctionInterfaceDescription()
                {
                    Category    = categoryStr,
                    Description = descriptionStr,
                    FuncType    = funcType,
                    IsGeneric   = methodInfo.IsGenericMethod,
                    Name        = methodInfo.Name,
                };
                InitMethodParamDescription(methodInfo, funcDescription);
                funcDescription.Signature = ModuleUtils.GetSignature(classDescription.Name, funcDescription);

                classDescription.Functions.Add(funcDescription);
            }
        }
 // 构造方法入参描述信息
 private void InitMethodParamDescription(MethodInfo method,
                                         FunctionInterfaceDescription funcDescription)
 {
     ParameterInfo[] paramInfo = method.GetParameters();
     funcDescription.Arguments = new List <IArgumentDescription>(paramInfo.Length);
     foreach (ParameterInfo parameterInfo in paramInfo)
     {
         ArgumentDescription paramDescription = GetParameterInfo(parameterInfo);
         funcDescription.Arguments.Add(paramDescription);
     }
     funcDescription.Return = GetReturnInfo(method.ReturnParameter);
 }
 private void InitConstructorParamDescription(ConstructorInfo constructor,
                                              FunctionInterfaceDescription funcDescription)
 {
     ParameterInfo[] paramInfo = constructor.GetParameters();
     funcDescription.Arguments = new List <IArgumentDescription>(paramInfo.Length);
     foreach (ParameterInfo parameterInfo in paramInfo)
     {
         ArgumentDescription paramDescription = GetParameterInfo(parameterInfo);
         funcDescription.Arguments.Add(paramDescription);
     }
     funcDescription.Return = null;
 }
Пример #5
0
        /// <summary>
        /// 获取普通函数方法签名
        /// </summary>
        public static string GetSignature(string className, FunctionInterfaceDescription funcDescription)
        {
            const string  signatureFormat = "{0}.{1}({2})";
            StringBuilder paramStr        = new StringBuilder(20);
            const string  delim           = ",";

            foreach (ArgumentDescription argument in funcDescription.Arguments)
            {
                paramStr.Append(argument.TypeDescription.Name).Append(delim);
            }
            if (paramStr.Length > 0)
            {
                paramStr.Remove(paramStr.Length - 1, 1);
            }
            return(string.Format(signatureFormat, className, funcDescription.Name, paramStr));
        }
        // 添加Struct默认构造函数
        private static void AddStructDefaultConstructor(Type classType, ClassInterfaceDescription classDescription)
        {
            string descriptionStr = "Struct default constructor";
            FunctionInterfaceDescription funcDescription = new FunctionInterfaceDescription()
            {
                Category    = classDescription.ClassTypeDescription.Category,
                Description = descriptionStr,
                FuncType    = FunctionType.StructConstructor,
                IsGeneric   = false,
                Name        = $"{classType.Name}_Constructor"
            };

            funcDescription.Arguments = new List <IArgumentDescription>(1);
            funcDescription.Return    = null;
            funcDescription.Signature = ModuleUtils.GetSignature(classType.Name, funcDescription);
            classDescription.Functions.Add(funcDescription);
        }
        private void AddFieldSetterDescription(Type classType, ClassInterfaceDescription classDescription)
        {
            List <IArgumentDescription> staticProperties = GetFieldDescriptions(classType, BindingFlags.Static | BindingFlags.Public);

            if (null != staticProperties && staticProperties.Count > 0)
            {
                FunctionInterfaceDescription staticSetterDesp = new FunctionInterfaceDescription()
                {
                    Name           = CommonConst.SetStaticFieldFunc,
                    Arguments      = staticProperties,
                    ClassType      = classDescription.ClassType,
                    ComponentIndex = classDescription.ComponentIndex,
                    FuncType       = FunctionType.StaticFieldSetter,
                    Signature      = ModuleUtils.GetSignature(classType.Name, CommonConst.SetStaticFieldFunc),
                    Return         = null,
                    IsGeneric      = false
                };
                classDescription.Functions.Add(staticSetterDesp);
            }

            List <IArgumentDescription> instanceProperties = GetFieldDescriptions(classType, BindingFlags.Instance | BindingFlags.Public);

            if (null != instanceProperties && instanceProperties.Count > 0)
            {
                FunctionInterfaceDescription instanceSetterDesp = new FunctionInterfaceDescription()
                {
                    Name           = CommonConst.SetInstanceFieldFunc,
                    Arguments      = instanceProperties,
                    ClassType      = classDescription.ClassType,
                    ComponentIndex = classDescription.ComponentIndex,
                    FuncType       = FunctionType.InstanceFieldSetter,
                    Signature      = ModuleUtils.GetSignature(classType.Name, CommonConst.SetInstanceFieldFunc),
                    Return         = null,
                    IsGeneric      = false
                };
                classDescription.Functions.Add(instanceSetterDesp);
            }
        }