internal static bool FindAsyncMethodVersion(MethodInfo method,
out MethodInfo beginMethod,
out MethodInfo endMethod)
{
beginMethod = null;
endMethod = null;
// determine names of Begin/End versions
String beginName = "Begin" + method.Name;
String endName = "End" + method.Name;
// determine parameter lists for Begin/End versions
ArrayList beginParameters = new ArrayList();
ArrayList endParameters = new ArrayList();
Type beginReturnType = typeof(IAsyncResult);
Type endReturnType = method.ReturnType;
ParameterInfo[] paramList = method.GetParameters();
foreach (ParameterInfo param in paramList)
{
if (param.IsOut)
endParameters.Add(param);
else
if (param.ParameterType.IsByRef)
{
beginParameters.Add(param);
endParameters.Add(param);
}
else
{
// it's an in parameter
beginParameters.Add(param);
}
}
beginParameters.Add(typeof(AsyncCallback));
beginParameters.Add(typeof(Object));
endParameters.Add(typeof(IAsyncResult));
// try to match these signatures with the methods on the type
Type type = method.DeclaringType;
MethodInfo[] methods = type.GetMethods();
foreach (MethodInfo mi in methods)
{
ParameterInfo[] parameterList = mi.GetParameters();
// see if return value is IAsyncResult
if (mi.Name.Equals(beginName) &&
(mi.ReturnType == beginReturnType) &&
CompareParameterList(beginParameters, parameterList))
{
beginMethod = mi;
}
else
if (mi.Name.Equals(endName) &&
(mi.ReturnType == endReturnType) &&
CompareParameterList(endParameters, parameterList))
{
endMethod = mi;
}
}
if ((beginMethod != null) && (endMethod != null))
return true;
else
return false;
} // FindAsyncMethodVersion