internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { string message; ValidationError error; CodeObjectCreateExpression createExpression = (CodeObjectCreateExpression)expression; if (isWritten) { message = string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, typeof(CodeObjectCreateExpression).ToString()); error = new ValidationError(message, ErrorNumbers.Error_InvalidAssignTarget); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } if (createExpression.CreateType == null) { error = new ValidationError(Messages.NullTypeType, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } Type resultType = validation.ResolveType(createExpression.CreateType); if (resultType == null) return null; // look up parameters List<CodeExpression> parameters = new List<CodeExpression>(); try { // Early exit from this if a cycle is detected. if (!validation.PushParentExpression(createExpression)) return null; bool hasInvalidArgument = false; for (int i = 0; i < createExpression.Parameters.Count; ++i) { CodeExpression parameter = createExpression.Parameters[i]; if (parameter == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullConstructorParameter, i.ToString(CultureInfo.CurrentCulture), RuleDecompiler.DecompileType(resultType)); error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); hasInvalidArgument = true; } else { RuleExpressionInfo parameterInfo = RuleExpressionWalker.Validate(validation, parameter, false); if (parameterInfo == null) hasInvalidArgument = true; parameters.Add(parameter); } } // quit if parameters not valid if (hasInvalidArgument) return null; } finally { validation.PopParentExpression(); } // see if we can find the matching constructor BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; if (validation.AllowInternalMembers(resultType)) bindingFlags |= BindingFlags.NonPublic; // creating a value-type object with no parameters can always be done if ((resultType.IsValueType) && (parameters.Count == 0)) return new RuleExpressionInfo(resultType); // error if type is an abstract type if (resultType.IsAbstract) { message = string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, RuleDecompiler.DecompileType(resultType)); error = new ValidationError(message, ErrorNumbers.Error_MethodNotExists); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } RuleConstructorExpressionInfo constructorInvokeInfo = validation.ResolveConstructor(resultType, bindingFlags, parameters, out error); if (constructorInvokeInfo == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, RuleDecompiler.DecompileType(resultType)); error = new ValidationError(message, ErrorNumbers.Error_MethodNotExists); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } return constructorInvokeInfo; }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError error; CodeObjectCreateExpression newParent = (CodeObjectCreateExpression)expression; if (isWritten) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeObjectCreateExpression).ToString() }), 0x17a); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return(null); } if (newParent.CreateType == null) { error = new ValidationError(Messages.NullTypeType, 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return(null); } Type type = validation.ResolveType(newParent.CreateType); if (type == null) { return(null); } List <CodeExpression> argumentExprs = new List <CodeExpression>(); try { if (!validation.PushParentExpression(newParent)) { return(null); } bool flag = false; for (int i = 0; i < newParent.Parameters.Count; i++) { CodeExpression expression3 = newParent.Parameters[i]; if (expression3 == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullConstructorParameter, new object[] { i.ToString(CultureInfo.CurrentCulture), RuleDecompiler.DecompileType(type) }), 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); flag = true; } else { if (RuleExpressionWalker.Validate(validation, expression3, false) == null) { flag = true; } argumentExprs.Add(expression3); } } if (flag) { return(null); } } finally { validation.PopParentExpression(); } BindingFlags constructorBindingFlags = BindingFlags.Public | BindingFlags.Instance; if (validation.AllowInternalMembers(type)) { constructorBindingFlags |= BindingFlags.NonPublic; } if (type.IsValueType && (argumentExprs.Count == 0)) { return(new RuleExpressionInfo(type)); } if (type.IsAbstract) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, new object[] { RuleDecompiler.DecompileType(type) }), 0x137); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return(null); } RuleConstructorExpressionInfo info2 = validation.ResolveConstructor(type, constructorBindingFlags, argumentExprs, out error); if (info2 == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, new object[] { RuleDecompiler.DecompileType(type) }), 0x137); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return(null); } return(info2); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError error; CodeObjectCreateExpression newParent = (CodeObjectCreateExpression) expression; if (isWritten) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeObjectCreateExpression).ToString() }), 0x17a); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return null; } if (newParent.CreateType == null) { error = new ValidationError(Messages.NullTypeType, 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return null; } Type type = validation.ResolveType(newParent.CreateType); if (type == null) { return null; } List<CodeExpression> argumentExprs = new List<CodeExpression>(); try { if (!validation.PushParentExpression(newParent)) { return null; } bool flag = false; for (int i = 0; i < newParent.Parameters.Count; i++) { CodeExpression expression3 = newParent.Parameters[i]; if (expression3 == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullConstructorParameter, new object[] { i.ToString(CultureInfo.CurrentCulture), RuleDecompiler.DecompileType(type) }), 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); flag = true; } else { if (RuleExpressionWalker.Validate(validation, expression3, false) == null) { flag = true; } argumentExprs.Add(expression3); } } if (flag) { return null; } } finally { validation.PopParentExpression(); } BindingFlags constructorBindingFlags = BindingFlags.Public | BindingFlags.Instance; if (validation.AllowInternalMembers(type)) { constructorBindingFlags |= BindingFlags.NonPublic; } if (type.IsValueType && (argumentExprs.Count == 0)) { return new RuleExpressionInfo(type); } if (type.IsAbstract) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, new object[] { RuleDecompiler.DecompileType(type) }), 0x137); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return null; } RuleConstructorExpressionInfo info2 = validation.ResolveConstructor(type, constructorBindingFlags, argumentExprs, out error); if (info2 == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, new object[] { RuleDecompiler.DecompileType(type) }), 0x137); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return null; } return info2; }