public virtual Object HeaderHandler(Header[] h)
{
SerializationMonkey m = (SerializationMonkey) FormatterServices.GetUninitializedObject(typeof(SerializationMonkey));
Header[] newHeaders = null;
if (h != null && h.Length > 0 && h[0].Name == "__methodName")
{
if (h.Length > 1)
{
newHeaders = new Header[h.Length -1];
Array.Copy(h, 1, newHeaders, 0, h.Length-1);
}
else
newHeaders = null;
}
else
newHeaders = h;
Type retType = null;
MethodInfo mi = MI as MethodInfo;
if (mi != null)
{
retType = mi.ReturnType;
}
ParameterInfo[] pinfos = _methodCache.Parameters;
// Calculate length
int outParamsCount = _methodCache.MarshalResponseArgMap.Length;
if (!((retType == null) || (retType == typeof(void))))
outParamsCount++;
Type[] paramTypes = new Type[outParamsCount];
String[] paramNames = new String[outParamsCount];
int paramTypesIndex = 0;
if (!((retType == null) || (retType == typeof(void))))
{
paramTypes[paramTypesIndex++] = retType;
}
foreach (int i in _methodCache.MarshalResponseArgMap)
{
paramNames[paramTypesIndex] = pinfos[i].Name;
if (pinfos[i].ParameterType.IsByRef)
paramTypes[paramTypesIndex++] = pinfos[i].ParameterType.GetElementType();
else
paramTypes[paramTypesIndex++] = pinfos[i].ParameterType;
}
((IFieldInfo)m).FieldTypes = paramTypes;
((IFieldInfo)m).FieldNames = paramNames;
FillHeaders(newHeaders, true);
m._obj = this;
return m;
}