public IList <Member> GetTargetMembers(Type targetType)
        {
            return(_membersCache.GetOrAdd(TypeKey.ForTargetMembers(targetType), key =>
            {
                if (key.Type.IsEnumerable())
                {
                    return Enumerable <Member> .EmptyArray;
                }

                var fields = GetFields(key.Type, All);
                var properties = GetProperties(key.Type, All);
                var methods = GetMethods(key.Type, OnlyCallableSetters, Member.SetMethod);

                var constructorParameterNames = key.Type
                                                .GetPublicInstanceConstructors()
                                                .SelectMany(ctor => ctor.GetParameters().Project(p => p.Name))
                                                .Distinct()
                                                .ToArray();

                var fieldsAndProperties = fields
                                          .Concat(properties)
                                          .Project(m =>
                {
                    m.HasMatchingCtorParameter = constructorParameterNames.Contains(m.Name, OrdinalIgnoreCase);
                    return m;
                })
                                          .ToArray();

                return GetMembers(fieldsAndProperties, methods);
            }));
        }
        public IEnumerable <Member> GetTargetMembers(Type targetType)
        {
            return(_membersCache.GetOrAdd(TypeKey.ForTargetMembers(targetType), key =>
            {
                var fields = GetFields(key.Type, OnlyTargets);
                var properties = GetProperties(key.Type, OnlyTargets);
                var methods = GetMethods(key.Type, OnlyCallableSetters, Member.SetMethod);

                var constructorParameterNames = key.Type
                                                .GetConstructors()
                                                .SelectMany(ctor => ctor.GetParameters().Select(p => p.Name))
                                                .Distinct()
                                                .ToArray();

                var fieldsAndProperties = fields
                                          .Concat(properties)
                                          .Where(m => !constructorParameterNames.Contains(m.Name, StringComparer.OrdinalIgnoreCase))
                                          .ToArray();

                return GetMembers(fieldsAndProperties, methods);
            }));
        }