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]); }
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()); }
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)); }