private static void AddMember(ServiceAssembly assembly, ServiceTypeFieldCollection result, MemberInfo member, Type memberType) { var attributes = member.GetCustomAttributes(typeof(ProtoMemberAttribute), true); if (attributes.Length == 0) return; Debug.Assert(attributes.Length == 1); var attribute = (ProtoMemberAttribute)attributes[0]; var shouldSerializeMember = member.DeclaringType.GetMethod( "ShouldSerialize" + member.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic ); result.Add(new ServiceTypeField( assembly, ReflectionOptimizer.BuildGetter(member), ReflectionOptimizer.BuildSetter(member, true), shouldSerializeMember == null ? null : ReflectionOptimizer.BuildShouldSerializeInvoker(shouldSerializeMember), attribute.Tag, attribute.IsRequired, memberType )); }
private static void AddMember(ServiceTypeFieldCollection result, MemberInfo member, Type memberType) { var attributes = member.GetCustomAttributes(typeof(ProtoMemberAttribute), true); if (attributes.Length == 0) return; Debug.Assert(attributes.Length == 1); var attribute = (ProtoMemberAttribute)attributes[0]; result.Add(new ServiceTypeField( ReflectionOptimizer.BuildGetter(member), ReflectionOptimizer.BuildSetter(member, true), attribute.Tag, attribute.IsRequired, memberType )); }
private ServiceTypeFieldCollection BuildFields(Type type) { ServiceTypeFieldCollection result; if (!_fields.TryGetValue(type, out result)) { result = new ServiceTypeFieldCollection(); foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { AddMember(result, field, field.FieldType); } foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { AddMember(result, property, property.PropertyType); } _fields[type] = result; } return result; }
private ServiceTypeFieldCollection BuildFields(ServiceAssembly assembly, Type type) { var result = new ServiceTypeFieldCollection(); foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { AddMember(assembly, result, field, field.FieldType); } foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { AddMember(assembly, result, property, property.PropertyType); } return result; }