/// <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); }