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