public static PropertyRegistrationType?GetPropertyRegistrationType(this IPropertySymbol property, Compilation compilation)
        {
            if (property.Type.TypeKind == TypeKind.TypeParameter)
            {
                return(property.GetGenericPropertyRegistrationType(compilation));
            }

            if (!(property.Type is INamedTypeSymbol propertyType))
            {
                return(null);
            }

            var parent = property.GetPropertyRegistrationParentType(compilation);

            if (!parent.HasValue)
            {
                return(null);
            }

            var parentValue = parent.Value;

            if (propertyType.EqualsTo(KnownTypes.LocalColumnOf, compilation))
            {
                return(PropertyRegistrationType.LocalColumn);
            }
            else if (propertyType.IsDerivedFrom(KnownTypes.Column, compilation))
            {
                return(parentValue == PropertyRegistrationParentType.Model ? PropertyRegistrationType.ModelColumn : PropertyRegistrationType.ProjectionColumn);
            }
            else if (propertyType.IsDerivedFrom(KnownTypes.Projection, compilation))
            {
                return(PropertyRegistrationType.Projection);
            }
            else if (propertyType.IsDerivedFrom(KnownTypes.ColumnList, compilation))
            {
                return(PropertyRegistrationType.ColumnList);
            }
            else if (propertyType.IsDerivedFrom(KnownTypes.Model, compilation))
            {
                return(PropertyRegistrationType.ChildModel);
            }
            else
            {
                return(null);
            }
        }