static SerializableType CompileType(Type type) { // at this point, type is a composite type object[] typeAttributes = type.GetCustomAttributes(typeof(AmqpContractAttribute), true); if (typeAttributes.Length != 1) { throw new NotSupportedException(type.FullName); } AmqpContractAttribute contractAttribute = (AmqpContractAttribute)typeAttributes[0]; string descriptorName = contractAttribute.Name; ulong? descriptorCode = contractAttribute.InternalCode; if (descriptorName == null && descriptorCode == null) { descriptorName = type.FullName; } int lastOrder = 0; SortedList <int, SerialiableMember> memberList = new SortedList <int, SerialiableMember>(); MemberInfo[] memberInfos = type.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (MemberInfo memberInfo in memberInfos) { if (memberInfo.DeclaringType != type || (memberInfo.MemberType != MemberTypes.Field && memberInfo.MemberType != MemberTypes.Property)) { continue; } object[] memberAttributes = memberInfo.GetCustomAttributes(typeof(AmqpMemberAttribute), true); if (memberAttributes.Length != 1) { continue; } AmqpMemberAttribute attribute = (AmqpMemberAttribute)memberAttributes[0]; SerialiableMember member = new SerialiableMember(); member.Name = attribute.Name ?? memberInfo.Name; member.Order = attribute.InternalOrder ?? lastOrder; member.Mandatory = attribute.Mandatory; member.Accessor = MemberAccessor.Create(memberInfo); // This will recursively resolve member types Type memberType = memberInfo.MemberType == MemberTypes.Field ? ((FieldInfo)memberInfo).FieldType : ((PropertyInfo)memberInfo).PropertyType; member.Type = GetType(memberType); memberList.Add(member.Order, member); lastOrder = member.Order >= lastOrder ? member.Order + 1 : lastOrder + 1; } SerialiableMember[] members = new SerialiableMember[memberList.Count]; for (int i = 0; i < memberList.Count; ++i) { members[i] = memberList[i]; } SerializableType serializableType = SerializableType.Create(type, descriptorName, descriptorCode, members); return(serializableType); }