protected void ExcludeMembers(Type type, string name)
        {
            var members = type.GetMember(name, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public);

            members.Should().HaveCountGreaterOrEqualTo(1, $"member \"{name}\" of type {type.FullName} not found");

            ExcludedMembers.AddRange(members);
        }
        protected void ExcludeMember <T>(string name)
        {
            var members = typeof(T).GetMember(name, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public);

            members.Should().HaveCount(1, $"member \"{name}\" of type {typeof(T).FullName} should exist only once");

            ExcludedMembers.Add(members[0]);
        }
Example #3
0
        private Expression CreateObjBodyFor(Expression item, Expression objList, string parentName)
        {
            var list = new List <Expression>();

            var type  = item.Type;
            var value = Expression.Variable(type);

            list.Add(Expression.Assign(value, Expression.Convert(item, type)));

            var addMethod = typeof(List <object>).GetMethod("Add", new Type[] { typeof(object) });

            if (type == typeof(object) || type.IsEnum() || type.IsPrimitive() || type == typeof(string))
            {
                list.Add(Expression.Call(objList, addMethod, Expression.Convert(value, typeof(object))));
            }
            else
            {
                foreach (var member in GetMembers(type))
                {
                    string memberName = parentName == null ? member.Name : string.Join(".", parentName, member.Name);

                    var memberType = member.GetUnderlyingType();
                    IEnumerable <Attribute> attributes;
                    Type searchAttributeType;

#if NETFX_CORE
                    attributes          = memberType.GetTypeInfo().GetCustomAttributes();
                    searchAttributeType = typeof(EditorBrowsableAttribute);
#else
                    attributes          = memberType.GetCustomAttributes();
                    searchAttributeType = typeof(BrowsableAttribute);
#endif
                    bool goesIn = attributes.Where(x => x.GetType() == searchAttributeType).Count() > 0;

                    if (ExcludedMembers.Contains(memberName))
                    {
                        continue;
                    }

                    if (!goesIn)
                    {
                        list.Add(Expression.Call(objList, addMethod, Expression.Convert(Expression.PropertyOrField(value, member.Name), typeof(object))));
                    }
                    else
                    {
                        var field = Expression.PropertyOrField(value, member.Name);
                        list.Add(CreateObjBodyFor(field, objList, memberName));
                    }
                }
            }

            return(Expression.Block(new ParameterExpression[] { value }, list));
        }
        private IReadOnlyList <MemberInfo> GetMembers(Type type, Type otherType)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            var members = GetAllMembers(type);

            return(members
                   .Where(m =>
            {
                if (m is Type)
                {
                    return false;
                }

                if (ExcludedMembers.Contains(m))
                {
                    return false;
                }

                if (ExcludeMemberCallback?.Invoke(type, otherType, m) ?? false)
                {
                    return false;
                }

                if (m is MethodInfo methodInfo)
                {
                    if (IsObjectMethod(methodInfo))
                    {
                        return false;
                    }

                    if (IsPropertyAccessor(members, methodInfo))
                    {
                        return false;
                    }
                }

                return true;
            })
                   .ToList().AsReadOnly());
        }
Example #5
0
        private Expression CreateStrBodyFor(Expression item, Expression stringList, string parentName)
        {
            var list = new List <Expression>();

            var type  = item.Type;
            var value = Expression.Variable(type);

            list.Add(Expression.Assign(value, Expression.Convert(item, type)));

            var addMethod = typeof(List <string>).GetMethod("Add", new Type[] { typeof(string) });

            if (type == typeof(object) || type.IsEnum() || type.IsPrimitive() || type == typeof(string))
            {
                CurrentMemberNames.Add(type.Name);
                CurrentMembersType.Add(type);
                AllMemberNames.Add(type.Name);
                list.Add(Expression.Call(stringList, addMethod, CallToString(value)));
            }
            else
            {
                foreach (var member in GetMembers(type))
                {
                    string memberName = parentName == null ? member.Name : string.Join(".", parentName, member.Name);

                    var memberType = member.GetUnderlyingType();
                    IEnumerable <Attribute> attributes;
                    Type searchAttributeType;

#if NETFX_CORE
                    attributes          = memberType.GetTypeInfo().GetCustomAttributes();
                    searchAttributeType = typeof(EditorBrowsableAttribute);
#else
                    attributes          = memberType.GetCustomAttributes();
                    searchAttributeType = typeof(BrowsableAttribute);
#endif
                    bool hasRecursiveAttr = attributes.Where(x => x.GetType() == searchAttributeType).Count() > 0;

                    if (!hasRecursiveAttr)
                    {
                        AllMemberNames.Add(memberName);
                    }

                    if (ExcludedMembers.Contains(memberName))
                    {
                        continue;
                    }

                    if (hasRecursiveAttr)
                    {
                        var field = Expression.PropertyOrField(value, member.Name);
                        list.Add(CreateStrBodyFor(field, stringList, memberName));
                    }
                    else
                    {
                        CurrentMembersType.Add(memberType);
                        CurrentMemberNames.Add(memberName);

                        if (!memberType.IsClass())
                        {
                            list.Add(Expression.Call(stringList, addMethod, CallToString(Expression.PropertyOrField(value, member.Name))));
                        }
                        else
                        {
                            var cond = Expression.Condition(Expression.NotEqual(value, Expression.Constant(null)),
                                                            Expression.Call(stringList, addMethod, CallToString(Expression.PropertyOrField(value, member.Name))),
                                                            Expression.Call(stringList, addMethod, Expression.Constant("null", typeof(string)))
                                                            );

                            list.Add(cond);
                        }
                    }
                }
            }

            return(Expression.Block(new ParameterExpression[] { value }, list));
        }