Exemple #1
0
        public static String GetKeyForMemberExpression(MemberExpression memberExp)
        {
            if (memberExp == null)
            {
                throw new ArgumentNullException("memberExp");
            }

            List <String> visitedNames = new List <String>();

            Member member = null;

            if (memberExp.Member is PropertyInfo)
            {
                member = new PropertyMember(memberExp.Member as PropertyInfo);
            }
            else
            {
                member = new FieldMember(memberExp.Member as FieldInfo);
            }

            visitedNames.Add(member.Name);

            var visitedMemberExp = memberExp;

            while (visitedMemberExp.Expression.NodeType == ExpressionType.MemberAccess)
            {
                visitedMemberExp = memberExp.Expression as MemberExpression;
                if (visitedMemberExp.Member is PropertyInfo)
                {
                    var parent = new PropertyMember(visitedMemberExp.Member as PropertyInfo);
                    visitedNames.Add(parent.Name);
                }
                else if (visitedMemberExp.Member is FieldInfo)
                {
                    var parent = new FieldMember(visitedMemberExp.Member as FieldInfo);
                    visitedNames.Add(parent.Name);
                }
                else
                {
                    return(null); //abort!
                }
            }

            visitedNames.Reverse();
            return(String.Join(Model.KeySeparator, visitedNames));
        }
Exemple #2
0
        public static IEnumerable <Member> GenerateMemberMap(Type t, Member parent = null, Boolean recursive = true)
        {
            foreach (var property in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                if (IsSerializableType(property.PropertyType))
                {
                    var propertyMember = new PropertyMember(property)
                    {
                        Parent = parent
                    };
                    yield return(propertyMember);

                    if (IsTraversableType(property.PropertyType) && recursive)
                    {
                        foreach (var member in GenerateMemberMap(property.PropertyType, parent: propertyMember))
                        {
                            yield return(member);
                        }
                    }
                }
            }

            foreach (var field in t.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                if (IsSerializableType(field.FieldType))
                {
                    var fieldMember = new FieldMember(field)
                    {
                        Parent = parent
                    };
                    yield return(fieldMember);

                    if (IsTraversableType(field.FieldType) && recursive)
                    {
                        foreach (var member in GenerateMemberMap(field.FieldType, parent: fieldMember))
                        {
                            yield return(member);
                        }
                    }
                }
            }
        }
Exemple #3
0
        public static void MapToDictionary(Object instance, IDictionary <Member, Object> mappedMembers, Member parent = null)
        {
            var t = instance.GetType();

            foreach (var property in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                if (IsSerializableType(property.PropertyType))
                {
                    var member = new PropertyMember(property)
                    {
                        Parent = parent
                    };
                    var value = member.GetValue(instance);

                    mappedMembers.Add(member, value);

                    if (IsTraversableType(member.MemberType) && !member.IsBinarySerialized)
                    {
                        MapToDictionary(value, mappedMembers, member);
                    }
                }
            }

            foreach (var field in t.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                if (IsSerializableType(field.FieldType))
                {
                    var member = new FieldMember(field)
                    {
                        Parent = parent
                    };
                    var value = member.GetValue(instance);

                    mappedMembers.Add(member, value);

                    if (IsTraversableType(member.MemberType) && !member.IsBinarySerialized)
                    {
                        MapToDictionary(value, mappedMembers, member);
                    }
                }
            }
        }