private TypeDefBase BuildType(Type propertyType) { TypeDefBase typeDefBase; var underlyingType = Nullable.GetUnderlyingType(propertyType); if (underlyingType != null) { NullableTypeDef valueTypeDef = new NullableTypeDef(propertyType, (ValueTypeDef)GetType(underlyingType)); _types.Add(propertyType, valueTypeDef); typeDefBase = valueTypeDef; } else if (propertyType.IsGenericType && (propertyType.GetGenericTypeDefinition() == typeof(List <>) || propertyType.GetGenericTypeDefinition() == typeof(IList <>) || propertyType.GetGenericTypeDefinition() == typeof(IEnumerable <>))) { typeDefBase = new ListTypeDef(propertyType, propertyType.GenericTypeArguments[0]); } else if (propertyType == typeof(string)) { ValueTypeDef valueTypeDef = new ValueTypeDef(propertyType); _types.Add(propertyType, valueTypeDef); typeDefBase = valueTypeDef; } else if (propertyType.IsClass || propertyType.IsInterface) { RefTypeDef refTypeDef = new RefTypeDef(propertyType); _types.Add(propertyType, refTypeDef); typeDefBase = refTypeDef; foreach (var propertyInfo in propertyType.GetProperties().Where(x => !new[] { "Equality" }.Any(y => x.PropertyType.Name.Contains(y)))) { refTypeDef.Props.Add(new Prop(propertyInfo, propertyInfo.Name, GetType(propertyInfo.PropertyType))); } } else if (propertyType.IsValueType) { ValueTypeDef valueTypeDef = new ValueTypeDef(propertyType); _types.Add(propertyType, valueTypeDef); typeDefBase = valueTypeDef; } else { throw new Exception(); } return(typeDefBase); }
public NullableTypeDef(Type type, ValueTypeDef underlyingTypeDef) : base(type) { UnderlyingTypeDef = underlyingTypeDef; Name = underlyingTypeDef.Name + "?"; }