private static void DescribeParameter(int recursionDepth, DescriptorBuilder parameterDescription, IEnumerable value) { Contract.Requires(parameterDescription != null); if (RecursionDepthExceeded(recursionDepth, parameterDescription)) { return; } if (value == null) { parameterDescription.AppendLine("null"); return; } bool isFirst = true; parameterDescription.AppendLine("["); parameterDescription.Indent(); foreach (object item in value) { if (!isFirst) { parameterDescription.AppendLine(","); } isFirst = false; DescribeParameter(recursionDepth + 1, parameterDescription, item.GetType(), item); } parameterDescription.Append("]"); parameterDescription.Outdent(); }
private static void DescribeClassParameter(int recursionDepth, DescriptorBuilder descriptorBuilder, object value) { Contract.Requires(descriptorBuilder != null); Contract.Requires(value != null); if (RecursionDepthExceeded(recursionDepth, descriptorBuilder)) { return; } // Describing a class parameter requires describing each property, each of which can also // be class parameters. Therefore there is an element of recursion. var properties = value.GetType().GetProperties(); descriptorBuilder.Append(value.GetType().FullName); descriptorBuilder.AppendLine("["); descriptorBuilder.Indent(); bool isFirst = true; foreach (var propertyInfo in properties) { if (!isFirst) { descriptorBuilder.AppendLine(","); } isFirst = false; descriptorBuilder.Append(propertyInfo.Name); descriptorBuilder.Append(": "); try { var propertyValue = propertyInfo.GetValue(value, BindingFlags.GetProperty, null, null, CultureInfo.InvariantCulture); DescribeParameter(recursionDepth + 1, descriptorBuilder, propertyInfo.PropertyType, propertyValue); } catch (NullReferenceException) { descriptorBuilder.Append("null"); } catch (Exception exception) { descriptorBuilder.Append(exception.Message); } } descriptorBuilder.Append("]"); descriptorBuilder.Outdent(); }
private static void DescribeNullParameter(DescriptorBuilder descriptorBuilder, ParameterInfo methodParameter) { Contract.Requires(descriptorBuilder != null); Contract.Requires(methodParameter != null); try { var t = methodParameter.ParameterType; if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable <>)) { descriptorBuilder.Append(methodParameter.Name + ": "); var nullableType = t.GetGenericArguments()[0]; descriptorBuilder.Append(nullableType.FullName); descriptorBuilder.Append(": null"); } else { descriptorBuilder.Append(methodParameter.Name + ": null"); } } catch (Exception ex) { descriptorBuilder.AppendLine("Exception describing parameter '" + methodParameter.Name + "' : " + ex.ToString()); } }
private static void DescribeParameter(int recursionDepth, DescriptorBuilder descriptorBuilder, ParameterInfo parameterInfo, object parameterValue) { Contract.Requires(descriptorBuilder != null); Contract.Requires(parameterInfo != null); if (RecursionDepthExceeded(recursionDepth, descriptorBuilder)) { return; } try { descriptorBuilder.Append(parameterInfo.Name + ": "); DescribeParameter(recursionDepth + 1, descriptorBuilder, parameterInfo.ParameterType, parameterValue); } catch (Exception ex) { descriptorBuilder.AppendLine("Exception describing parameter '" + parameterInfo.Name + "' : " + ex.ToString()); } }
private static void DescribeParameter(int recursionDepth, DescriptorBuilder descriptorBuilder, Type type, object parameterValue) { Contract.Requires(descriptorBuilder != null); Contract.Requires(type != null); if (RecursionDepthExceeded(recursionDepth, descriptorBuilder)) { return; } if (parameterValue == null) { descriptorBuilder.Append("null"); return; } var compareType = parameterValue.GetType(); if (compareType.IsGenericType && compareType.GetGenericTypeDefinition() == typeof(Nullable <>)) { compareType = compareType.GetGenericArguments()[0]; } Func <Type, bool> isType = t => t == compareType; if (isType(typeof(string))) { descriptorBuilder.Append(DescribeParameter(parameterValue as string)); return; } if (isType(typeof(bool))) { descriptorBuilder.Append(DescribeParameter((bool)parameterValue)); return; } if (isType(typeof(byte))) { descriptorBuilder.Append(DescribeParameter((byte)parameterValue)); return; } if (isType(typeof(short))) { descriptorBuilder.Append(DescribeParameter((short)parameterValue)); return; } if (isType(typeof(int))) { descriptorBuilder.Append(DescribeParameter((int)parameterValue)); return; } if (isType(typeof(long))) { descriptorBuilder.Append(DescribeParameter((long)parameterValue)); return; } if (isType(typeof(float)) || isType(typeof(double))) { descriptorBuilder.Append(DescribeParameter((double)parameterValue)); return; } if (isType(typeof(decimal))) { descriptorBuilder.Append(DescribeParameter((decimal)parameterValue)); return; } if (isType(typeof(TimeSpan))) { descriptorBuilder.Append(DescribeParameter((TimeSpan)parameterValue)); return; } if (isType(typeof(DateTime))) { descriptorBuilder.Append(DescribeParameter((DateTime)parameterValue)); return; } if (isType(typeof(Guid))) { descriptorBuilder.Append(DescribeParameter((Guid)parameterValue)); return; } if (compareType.FullName.StartsWith("System.Collections.Generic.KeyValuePair", StringComparison.Ordinal)) { DescribeKeyValuePair(recursionDepth + 1, descriptorBuilder, parameterValue); return; } var iCollectionValue = parameterValue as ICollection; if (iCollectionValue != null) { DescribeParameter(recursionDepth + 1, descriptorBuilder, iCollectionValue); return; } var iEnumerableValue = parameterValue as IEnumerable; if (iEnumerableValue != null) { DescribeParameter(recursionDepth + 1, descriptorBuilder, iEnumerableValue); return; } if (compareType.BaseType == typeof(System.Enum)) { DescribeParameter(descriptorBuilder, (System.Enum)parameterValue); return; } if (compareType.IsClass) { DescribeClassParameter(recursionDepth + 1, descriptorBuilder, parameterValue); return; } descriptorBuilder.AppendLine("|Type: {0}|".FormatInvariant(type.FullName)); }