private static Dictionary <string, AssignmentMember> GetMembers(Type type, bool isReadable) { var map = new Dictionary <string, AssignmentMember>(); var members = type.GetAllPublicMembers(); foreach (var info in members) { if (info.DeclaringType == typeof(object)) { continue; } var propertyInfo = info as PropertyInfo; if (propertyInfo != null) { if (isReadable) { if (propertyInfo.CanRead) { map[info.Name] = new AssignmentMember(propertyInfo.PropertyType, propertyInfo); continue; } } else { if (propertyInfo.CanWrite && propertyInfo.SetMethod() != null) { map[info.Name] = new AssignmentMember(propertyInfo.PropertyType, propertyInfo); continue; } } } var fieldInfo = info as FieldInfo; if (fieldInfo != null) { map[info.Name] = new AssignmentMember(fieldInfo.FieldType, fieldInfo); continue; } var methodInfo = info as MethodInfo; if (methodInfo != null) { var parameterInfos = methodInfo.GetParameters(); if (isReadable) { if (parameterInfos.Length == 0) { var name = info.Name.StartsWith("get_") ? info.Name.Substring(4) : info.Name; if (!map.ContainsKey(name)) { map[name] = new AssignmentMember(methodInfo.ReturnType, methodInfo); continue; } } } else { if (parameterInfos.Length == 1 && methodInfo.ReturnType == typeof(void)) { var name = info.Name.StartsWith("set_") ? info.Name.Substring(4) : info.Name; if (!map.ContainsKey(name)) { map[name] = new AssignmentMember(parameterInfos[0].ParameterType, methodInfo); continue; } } } } } return(map); }
public void AddMatch(string name, AssignmentMember readMember, AssignmentMember writeMember) { this.AssignmentMemberMap[name] = new AssignmentEntry(name, readMember, writeMember); }