public override void VisitProperty(IPropertySymbol symbol) { var type = symbol.Type; var rp = new ReflectedProperty(); if (type.Name == "List" || type.Name == "Dictionary") { rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}.Count" : $"{currentParentName}.{symbol.Name}.Count"; rp.Type = "Int32"; Properties.Add(rp); } else if (type.BaseType?.Name == "Array" || type.Name == "IEnumerable") { rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}.Count()" : $"{currentParentName}.{symbol.Name}.Count()"; rp.Type = "Int32"; Properties.Add(rp); } else if (type.BaseType.Name == "Enum") { rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}" : $"{currentParentName}.{symbol.Name}"; rp.Type = type.BaseType.Name; Properties.Add(rp); } else if (!IsCustomType(type.Name)) { rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}" : $"{currentParentName}.{symbol.Name}"; rp.Type = type.Name; Properties.Add(rp); } if (type.Name == "List" || type.Name == "IEnumerable") { type = ((INamedTypeSymbol)symbol.GetMethod.ReturnType).TypeArguments[0]; if (IsCustomType(type.Name)) { currentParentName = $"{currentParentName}.{symbol.Name}"; firstOrLast = "FirstOrDefault()"; VisitNamedType(type as INamedTypeSymbol); firstOrLast = "LastOrDefault()"; VisitNamedType(type as INamedTypeSymbol); firstOrLast = null; currentParentName = ParentName; base.VisitProperty(symbol); } else { type = ((INamedTypeSymbol)symbol.GetMethod.ReturnType).TypeArguments[0]; rp = new ReflectedProperty(); rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}.FirstOrDefault()" : $"{currentParentName}.{symbol.Name}.FirstOrDefault()"; rp.Type = type.Name; Properties.Add(rp); rp = new ReflectedProperty(); rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}.LastOrDefault()" : $"{currentParentName}.{symbol.Name}.LastOrDefault()"; rp.Type = type.Name; Properties.Add(rp); } } else if (type.BaseType.Name == "Array") { type = ((IArrayTypeSymbol)symbol.GetMethod.ReturnType).ElementType; if (IsCustomType(type.Name)) { currentParentName = $"{currentParentName}.{symbol.Name}"; firstOrLast = "FirstOrDefault()"; VisitNamedType(type as INamedTypeSymbol); firstOrLast = "LastOrDefault()"; VisitNamedType(type as INamedTypeSymbol); firstOrLast = null; currentParentName = ParentName; base.VisitProperty(symbol); } else { rp = new ReflectedProperty(); rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}.FirstOrDefault()" : $"{currentParentName}.{symbol.Name}.FirstOrDefault()"; rp.Type = type.Name; Properties.Add(rp); rp = new ReflectedProperty(); rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}.LastOrDefault()" : $"{currentParentName}.{symbol.Name}.LastOrDefault()"; rp.Type = type.Name; Properties.Add(rp); } } else if (type.Name == "Dictionary") { type = ((INamedTypeSymbol)symbol.GetMethod.ReturnType).TypeArguments[1]; if (IsCustomType(type.Name)) { currentParentName = $"{currentParentName}.{symbol.Name}"; firstOrLast = "FirstOrDefault().Value"; VisitNamedType(type as INamedTypeSymbol); firstOrLast = "LastOrDefault().Value"; VisitNamedType(type as INamedTypeSymbol); firstOrLast = null; currentParentName = ParentName; base.VisitProperty(symbol); } else { rp = new ReflectedProperty(); rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}.FirstOrDefault().Value" : $"{currentParentName}.{symbol.Name}.FirstOrDefault().Value"; rp.Type = type.Name; Properties.Add(rp); rp = new ReflectedProperty(); rp.Name = firstOrLast != null ? $"{currentParentName}.{firstOrLast}.{symbol.Name}.LastOrDefault().Value" : $"{currentParentName}.{symbol.Name}.LastOrDefault().Value"; rp.Type = type.Name; Properties.Add(rp); } } else if (type.BaseType.Name == "Object" && IsCustomType(type.Name)) { currentParentName = $"{currentParentName}.{symbol.Name}"; VisitNamedType(type as INamedTypeSymbol); currentParentName = ParentName; base.VisitProperty(symbol); } }