public static MessageDescription CreateMessageDescription (
OperationContractAttribute oca, ParameterInfo[] plist, string name, string defaultNamespace, string action, bool isRequest, bool isCallback, Type retType, ICustomAttributeProvider retTypeAttributes)
{
var dir = isRequest ^ isCallback ? MessageDirection.Input : MessageDirection.Output;
MessageDescription md = new MessageDescription (action, dir) { IsRequest = isRequest };
MessageBodyDescription mb = md.Body;
mb.WrapperName = name + (isRequest ? String.Empty : "Response");
mb.WrapperNamespace = defaultNamespace;
if (oca.HasProtectionLevel)
md.ProtectionLevel = oca.ProtectionLevel;
// Parts
int index = 0;
foreach (ParameterInfo pi in plist) {
// AsyncCallback and state are extraneous.
if (oca.AsyncPattern && pi.Position == plist.Length - 2)
break;
// They are ignored:
// - out parameter in request
// - neither out nor ref parameter in reply
if (isRequest && pi.IsOut)
continue;
if (!isRequest && !pi.IsOut && !pi.ParameterType.IsByRef)
continue;
MessagePartDescription pd = CreatePartCore (GetMessageParameterAttribute (pi), pi.Name, defaultNamespace);
pd.Index = index++;
pd.Type = MessageFilterOutByRef (pi.ParameterType);
mb.Parts.Add (pd);
}
// ReturnValue
if (!isRequest) {
MessagePartDescription mp = CreatePartCore (GetMessageParameterAttribute (retTypeAttributes), name + "Result", mb.WrapperNamespace);
mp.Index = 0;
mp.Type = retType;
mb.ReturnValue = mp;
}
// FIXME: fill properties.
return md;
}