private void WriteStringLength(ILWriter writer, PropertyInfo property, StringLengthAttribute attribute) { var local = writer.DeclareLocal <string>(); if (property.PropertyType == typeof(string)) { writer.LoadFirstParameter(); writer.GetPropertyValue(property); writer.SetLocal(local); writer.LoadLocal(local); writer.LoadNull(); var notNullBlock = writer.IfEqualThen(); var isNullMessage = CommonResults.PropertyCannotBeNull.WithValues(property.ReflectedType.Name, property.Name); WriteFailureResult(writer, ValidationKind.StringLength, isNullMessage); writer.Return(); writer.MarkLabel(notNullBlock); var lengthValue = writer.DeclareLocal <int>(); var length = KnownMetadata.Properties.String_Length; writer.LoadLocal(local); writer.GetPropertyValue(length); writer.SetLocal(lengthValue); var minValue = attribute.Minimum; writer.LoadLocal(lengthValue); writer.LoadInt32((int)minValue); var longerThanMinBlock = writer.IfLessThan(); var tooShortMessage = CommonResults.StringPropertyIsTooShort.WithValues(property.ReflectedType.Name, property.Name, minValue); WriteFailureResult(writer, ValidationKind.StringLength, tooShortMessage); writer.Return(); writer.MarkLabel(longerThanMinBlock); var maxValue = attribute.Maximum; //The maximum value might not be set, if so then just ignore it if (maxValue > 0) { writer.LoadLocal(lengthValue); writer.LoadInt32((int)maxValue); var shorterThanMaxBlock = writer.IfGreaterThan(); var tooLongMessage = CommonResults.StringPropertyIsTooLong.WithValues(property.ReflectedType.Name, property.Name, maxValue); WriteFailureResult(writer, ValidationKind.StringLength, tooLongMessage); writer.Return(); writer.MarkLabel(shorterThanMaxBlock); } } else { WriteNotApplicableResult(writer, ValidationKind.StringLength); writer.Return(); } }
private void WriteRequireNotNull(ILWriter writer, PropertyInfo property, NotNullAttribute notNullAttribute) { if (property.PropertyType.IsClass || property.PropertyType.IsInterface) { writer.LoadFirstParameter(); writer.GetPropertyValue(property); writer.LoadNull(); var elseLabel = writer.IfEqualThen(); var message = CommonResults.PropertyCannotBeNull.WithValues(property.ReflectedType.Name, property.Name); WriteFailureResult(writer, ValidationKind.RequireNotNull, message); writer.Return(); writer.MarkLabel(elseLabel); } else { //Value types, pointers, everything that can't be null is here WriteNotApplicableResult(writer, ValidationKind.RequireNotNull); writer.Return(); } }