private void ResolveContracts(ServiceEndpoint endpoint)
{
//Add default contracts
AddContract(typeof(AbstractMessage));
AddContract(typeof(AcknowledgeMessage));
AddContract(typeof(CommandMessage));
AddContract(typeof(ErrorMessage));
AddContract(typeof(RemotingMessage));
//Add endpoint contract's types
var types = new List<Type>();
//Get return types and methods parameters
foreach (var method in endpoint.Contract.Operations.Select(operation => operation.SyncMethod))
{
types.Add(method.ReturnType);
types.AddRange(method.GetParameters().Select(param => param.ParameterType));
}
//Get operation fault contracts
var faultTypes = from operation in endpoint.Contract.Operations
from fault in operation.Faults
select fault.DetailType;
types.AddRange(faultTypes);
//Handle complex types
for (var i = 0; i < types.Count; i++)
{
var type = types[i];
//Type is an array
if (type.IsArray && type.HasElementType)
types[i] = type.GetElementType();
}
//Remove duplicates and invalid types
var validtypes = types
.Distinct()
.Where(IsValidDataContract)
.Where(type => !IsContractRegistered(type));
//Register all valid types
foreach (var type in validtypes)
AddContract(type);
}