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 )); }
public void Build(ServiceAssembly assembly) { Fields = BuildFields(assembly, Type); var messageAttributes = Type.GetCustomAttributes(typeof(ProtoMessageAttribute), true); if (messageAttributes.Length > 0) { Debug.Assert(messageAttributes.Length == 1); Message = ProtoChannel.ServiceRegistry.GetAssemblyRegistration(Type.Assembly).MessagesById[ ((ProtoMessageAttribute)messageAttributes[0]).MessageId ]; } }
public ServiceTypeField(ServiceAssembly assembly, ReflectionOptimizer.Getter getter, ReflectionOptimizer.Setter setter, ReflectionOptimizer.ShouldSerializeInvoker shouldSerializeMethod, int tag, bool isRequired, Type type) { Require.NotNull(getter, "getter"); Require.NotNull(setter, "setter"); Require.NotNull(type, "type"); Getter = getter; Setter = setter; ShouldSerializeMethod = shouldSerializeMethod; Tag = tag; IsRequired = isRequired; Type = type; // See whether the field is a collection type. var listItemType = TypeUtil.GetCollectionType(type); if (listItemType != null) { // We handle two collection types: List<> and the rest. // The rest we handle as an array. bool isList = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>); if (isList) CollectionType = type; else CollectionType = listItemType.MakeArrayType(); Type = listItemType; } // Build the service type if the field type is a protobuf type. var typeAttributes = Type.GetCustomAttributes(typeof(ProtoContractAttribute), true); if (typeAttributes.Length > 0) ServiceType = assembly.GetServiceType(Type); }
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; }