private void GenerateContractServiceKnownTypes(CodeTypeDeclaration contractInterface, DomainOperationEntry operation, HashSet <Type> registeredTypes) { List <Attribute> knownTypeAttributes = new List <Attribute>(); foreach (DomainOperationParameter parameter in operation.Parameters) { Type t = CodeGenUtilities.TranslateType(parameter.ParameterType); // All Nullable<T> types are unwrapped to the underlying non-nullable, because // that is they type we need to represent, not typeof(Nullable<T>) t = TypeUtility.GetNonNullableType(t); if (TypeUtility.IsPredefinedListType(t) || TypeUtility.IsComplexTypeCollection(t)) { Type elementType = TypeUtility.GetElementType(t); if (elementType != null) { t = elementType.MakeArrayType(); } } // Check if the type is a simple type or already registered if (registeredTypes.Contains(t) || !this.TypeRequiresRegistration(t)) { continue; } // Record the type to prevent redundant [ServiceKnownType]'s. // This loop executes within a larger loop over multiple // DomainOperationEntries that may have already processed it. registeredTypes.Add(t); // If we determine we need to generate this enum type on the client, // then we need to register that intent and conjure a virtual type // here in our list of registered types to account for the fact it // could get a different root namespace on the client. if (t.IsEnum && this.ClientProxyGenerator.NeedToGenerateEnumType(t)) { // Request deferred generation of the enum this.ClientProxyGenerator.RegisterUseOfEnumType(t); // Compose a virtual type that will reflect the correct namespace // on the client when the [ServiceKnownType] is created. t = new VirtualType(t.Name, CodeGenUtilities.TranslateNamespace(t, this.ClientProxyGenerator), t.Assembly, t.BaseType); } knownTypeAttributes.Add(new ServiceKnownTypeAttribute(t)); } if (knownTypeAttributes.Count > 0) { CustomAttributeGenerator.GenerateCustomAttributes( this.ClientProxyGenerator, contractInterface, knownTypeAttributes, contractInterface.CustomAttributes, contractInterface.Comments, true /* force propagation, we want a compile error if these types aren't present on client */); } }