private string GetPropertyTypeName(PropertyInformation propertyInfo) { var propertyTypeSymbol = propertyInfo.Property.Type; if (propertyTypeSymbol is INamedTypeSymbol namedType && namedType.IsGenericType) { return(CreateGenericTypeWithParameters(propertyInfo)); } return(ConvertToNullableIfRequired(propertyInfo, propertyTypeSymbol)); }
private string ConvertToNullableIfRequired(PropertyInformation propertyInfo, ITypeSymbol typeSymbol) { string genericTypeParam = GetPropertyTypeName(typeSymbol).TypeName; if (typeSymbol.IsValueType && typeSymbol.SpecialType != SpecialType.System_Nullable_T && typeSymbol.NullableAnnotation != NullableAnnotation.Annotated) { propertyInfo.IsConvertedToNullableType = true; genericTypeParam = $"System.Nullable<{genericTypeParam}>"; } if (!typeSymbol.IsValueType && typeSymbol.SpecialType != SpecialType.System_Nullable_T) { genericTypeParam = $"{genericTypeParam}?"; } return(genericTypeParam); }
private void BuildPropery(BuilderState state, PropertyInformation propertyInfo, int propertyId) { state.ToProcessTypeSymbols.Add(propertyInfo.Property.Type); string fieldName = Casing.PrefixUnderscoreCamelCase(propertyInfo.Property.Name); string propertyTypeName = GetPropertyTypeName(propertyInfo); state.AppendLine($"private {propertyTypeName} {fieldName};"); BuildAttributes(state, propertyInfo.Property.GetAttributes()); state.AppendLine($"public {propertyTypeName} {propertyInfo.Property.Name}"); state.AppendLine("{"); var getterSetter = state.IncrementIdentation(); getterSetter.AppendLine($"get {{ return {fieldName}; }}"); getterSetter.AppendLine("set"); getterSetter.AppendLine("{"); var setterBody = getterSetter.IncrementIdentation(); setterBody.AppendLine($"Properties[{propertyId}] = true;"); setterBody.AppendLine($"{fieldName} = value;"); getterSetter.AppendLine("}"); state.AppendLine("}"); }