/// <summary>
        /// 包装指定的属性
        /// </summary>
        /// <param name="propertyInfo">属性信息</param>
        /// <returns>成员属性模型</returns>
        private CodeMemberProperty WrapProperty(PropertyInfo propertyInfo)
        {
            var generate = CreatePropertyMember(propertyInfo.Name, propertyInfo.PropertyType);

            if (propertyInfo.GetIndexParameters().Length > 0)
            {
                return(null);
            }

            if (propertyInfo.CanRead)
            {
                generate.GetStatements.Add(new CodeMethodReturnStatement(
                                               new CodeFieldReferenceExpression(
                                                   StaticWrapUtil.GetInstance(),
                                                   propertyInfo.Name)));
            }

            if (propertyInfo.CanWrite)
            {
                generate.SetStatements.Add(new CodeAssignStatement(
                                               new CodeFieldReferenceExpression(
                                                   StaticWrapUtil.GetInstance(),
                                                   propertyInfo.Name
                                                   ), new CodePropertySetValueReferenceExpression()));
            }

            return(generate);
        }
        /// <summary>
        /// 包装指定的事件
        /// </summary>
        /// <param name="eventInfo">指定的事件</param>
        private CodeSnippetTypeMember WrapEvent(EventInfo eventInfo)
        {
            var generate = CreateEventMember(eventInfo.Name);

            var code = template.Replace("{type}", StaticWrapUtil.GenerateExpression(new CodeTypeReferenceExpression(
                                                                                        new CodeTypeReference(eventInfo.EventHandlerType.ToString()))));

            code          = code.Replace("{instance}", StaticWrapUtil.StaticInstance);
            code          = code.Replace("{event}", eventInfo.Name);
            generate.Text = code;

            return(generate);
        }
        /// <summary>
        /// 为成员方法模型附上成员参数信息
        /// </summary>
        /// <param name="member">成员方法模型</param>
        /// <param name="method">需要导入到成员方法模型的成员函数</param>
        /// <returns>成员顺序表达式</returns>
        private CodeExpression[] AttachParameter(CodeMemberMethod member, MethodInfo method)
        {
            var parameters = method.GetParameters();
            var result     = new CodeExpression[parameters.Length];

            for (var index = 0; index < parameters.Length; index++)
            {
                var parameter            = parameters[index];
                var parameterDeclaration = new CodeParameterDeclarationExpression
                {
                    Name = parameter.Name,
                    Type = new CodeTypeReference(parameter.ParameterType.ToString().TrimEnd('&')),
                };

                var direction = string.Empty;
                // in, out, ref 参数处理
                if (parameter.IsOut)
                {
                    parameterDeclaration.Direction = FieldDirection.Out;
                    direction = "out ";
                }
                else if (parameter.IsIn)
                {
                    parameterDeclaration.Direction = FieldDirection.In;
                }
                else if (parameter.ParameterType.IsByRef)
                {
                    parameterDeclaration.Direction = FieldDirection.Ref;
                    direction = "ref ";
                }

                // 带有默认值的可选参数处理
                if (parameter.IsOptional)
                {
                    parameterDeclaration.Name += " = " + StaticWrapUtil.ToDefaultValueString(parameter.DefaultValue);
                }
                //else if (index == (parameters.Length - 1) && parameter.ParameterType.IsArray)
                //{
                //    parameterDeclaration.Type = new CodeTypeReference("params " + parameterDeclaration.Type.BaseType + "[]");
                //}

                member.Parameters.Add(parameterDeclaration);
                result[index] = new CodeVariableReferenceExpression
                {
                    VariableName = direction + parameter.Name
                };
            }

            return(result);
        }
        /// <summary>
        /// 导入成员函数
        /// </summary>
        /// <param name="method">需要导入的成员函数</param>
        private CodeMemberMethod WrapMethod(MethodInfo method)
        {
            var generate   = CreateMethod(method.Name, method);
            var parameters = AttachParameter(generate, method);

            if (method.ReturnType != typeof(void))
            {
                generate.Statements.Add(new CodeMethodReturnStatement(new CodeMethodInvokeExpression(
                                                                          new CodeMethodReferenceExpression(StaticWrapUtil.GetInstance(), method.Name
                                                                                                            ), parameters
                                                                          )));
            }
            else
            {
                generate.Statements.Add(new CodeMethodInvokeExpression(
                                            new CodeMethodReferenceExpression(StaticWrapUtil.GetInstance(), method.Name
                                                                              ), parameters
                                            ));
            }

            return(generate);
        }