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 WriteNotApplicableResult(ILWriter writer, ValidationKind kind) { var notApplicable = KnownMetadata.Methods.ValidationResult_NotApplicable; writer.LoadInt32((int)kind); writer.StaticMethodCall(notApplicable); }
private void WriteFailureResult(ILWriter writer, ValidationKind kind, string message) { var failure = KnownMetadata.Methods.ValidationResult_Failure; writer.LoadInt32((int)kind); writer.LoadString(message); writer.StaticMethodCall(failure); }
private void WriteLogBody(ILWriter writer, Type type, MemberInfo[] loggableMembers) { var localTypedInstance = writer.DeclareLocal(type); writer.LoadFirstParameter(); writer.Cast(typeof(object), type); writer.SetLocal(localTypedInstance); //TODO: Recurse into loggable members foreach (var member in loggableMembers) { var logAttributes = member.GetCustomAttributes <LogAttribute>().ToArray(); if (logAttributes.Length == 0) { continue; } //TODO: Support multiple attributes per member var attribute = logAttributes[0]; if (attribute.Ignore) { continue; } if (CanWriteToLog(attribute.Visibility)) { LocalBuilder localValue; LocalBuilder localLogItem = writer.DeclareLocal <CustomLoggableMember>(); switch (member.MemberType) { case MemberTypes.Field: var field = (FieldInfo)member; localValue = writer.DeclareLocal(field.FieldType); writer.LoadLocal(localTypedInstance); writer.LoadField(field); writer.SetLocal(localValue); break; case MemberTypes.Property: var property = (PropertyInfo)member; localValue = writer.DeclareLocal(property.PropertyType); writer.LoadLocal(localTypedInstance); writer.GetPropertyValue(property); writer.SetLocal(localValue); break; default: var message = String.Format("Encountered loggable member '{0}' that was not supported in IL generation", member.Name); System.Diagnostics.Debug.Fail(message); throw new ILGenerationException(message); } writer.New <CustomLoggableMember>(); writer.SetLocal(localLogItem); writer.LoadLocal(localLogItem); writer.LoadInt32((int)attribute.Visibility); writer.SetPropertyValue(typeof(CustomLoggableMember).GetProperty("MemberVisibility")); writer.LoadLocal(localLogItem); writer.TypeOf(type); writer.Cast(localValue.LocalType, typeof(Type)); writer.SetPropertyValue(KnownMetadata.Properties.CustomLoggableMember_OwningType); writer.LoadLocal(localLogItem); writer.LoadString(member.Name); writer.SetPropertyValue(KnownMetadata.Properties.CustomLoggableMember_MemberName); writer.LoadLocal(localLogItem); writer.TypeOf(localValue.LocalType); writer.Cast(localValue.LocalType, typeof(Type)); writer.SetPropertyValue(KnownMetadata.Properties.CustomLoggableMember_MemberType); writer.LoadLocal(localLogItem); writer.LoadLocal(localValue); writer.SetPropertyValue(KnownMetadata.Properties.CustomLoggableMember_MemberValue); writer.LoadSecondParameter(); writer.LoadLocal(localLogItem); writer.ActionDelegateMethodCall <CustomLoggableMember>(); } } writer.Return(); }