示例#1
0
        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
            ));
        }
示例#2
0
        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);
        }
示例#4
0
        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;
        }