void EnsureProperties()
        {
            if (_scanProperties)
            {
                return;
            }
            _scanProperties = true;
            var items = ReflectGetProperties(SourceClrType)
                        .Select(t => new ReflectedPropertyDefinition(t));

            foreach (var item in items)
            {
                this.properties.Add(item);
            }

            if (typeof(IPropertiesContainer).GetTypeInfo().IsAssignableFrom(type))
            {
                var one = new IndexerUsingIPropertiesPropertyDefinition(true);
                Properties.AddInternal(one);
                _defaultProperties.Add(one);
            }
            else if (typeof(IPropertyProvider).GetTypeInfo().IsAssignableFrom(type))
            {
                // Try using IPropertyProvider
                var one = new IndexerUsingIPropertiesPropertyDefinition(typeof(IProperties).IsAssignableFrom(type));
                Properties.AddInternal(one);
                _defaultProperties.Add(one);
            }

            var defaultMember = (PropertyInfo)this.type.GetTypeInfo().GetDefaultMembers().FirstOrDefault(IsValidIndexer);

            if (defaultMember != null)
            {
                var one = new ReflectedIndexerPropertyDefinition(defaultMember);
                Properties.AddInternal(one);
                _defaultProperties.Add(one);
            }

            var methods = type.GetTypeInfo().GetMethods(BindingFlags.Instance | BindingFlags.Public);

            FindExtensionProperties(methods);

            // Could define extender properties
            ExtensionCache.Init();
            this.properties.MakeReadOnly();
        }