Method CreateBeginInvokeExtension(ICallableType anonymousType, Method beginInvoke, out MethodInvocationExpression mie)
{
InternalMethod beginInvokeEntity = (InternalMethod)beginInvoke.Entity;
Method extension = CodeBuilder.CreateMethod("BeginInvoke", TypeSystemServices.Map(typeof(IAsyncResult)),
TypeMemberModifiers.Public | TypeMemberModifiers.Static);
extension.Attributes.Add(CodeBuilder.CreateAttribute(Types.BooExtensionAttribute));
if (MetadataUtil.HasClrExtensions())
{
extension.Attributes.Add(CodeBuilder.CreateAttribute(Types.ClrExtensionAttribute));
}
ParameterDeclaration self = CodeBuilder.CreateParameterDeclaration(0, "self", beginInvokeEntity.DeclaringType);
extension.Parameters.Add(self);
CodeBuilder.DeclareParameters(extension, anonymousType.GetSignature().Parameters, 1);
mie = CodeBuilder.CreateMethodInvocation(
CodeBuilder.CreateReference(self),
beginInvokeEntity);
ParameterDeclarationCollection parameters = extension.Parameters;
for (int i = 1; i < parameters.Count; ++i)
{
mie.Arguments.Add(CodeBuilder.CreateReference(parameters[i]));
}
extension.Body.Add(new ReturnStatement(mie));
return extension;
}