MethodBuilder DefineMethod(TypeBuilder typeBuilder, Method method, MethodAttributes attributes)
{
ParameterDeclarationCollection parameters = method.Parameters;
MethodAttributes methodAttributes = GetMethodAttributes(method) | attributes;
string name;
if (method.ExplicitInfo != null)
{
name = method.ExplicitInfo.InterfaceType.Name + "." + method.Name;
}
else
{
name = method.Name;
}
MethodBuilder builder = typeBuilder.DefineMethod(name,
methodAttributes);
if (method.GenericParameters.Count != 0)
{
DefineGenericParameters(builder, method.GenericParameters.ToArray());
}
builder.SetParameters(GetParameterTypes(parameters));
IType returnType = GetEntity(method).ReturnType;
if (IsPInvoke(method) && TypeSystemServices.IsUnknown(returnType))
{
returnType = TypeSystemServices.VoidType;
}
builder.SetReturnType(GetSystemType(returnType));
builder.SetImplementationFlags(ImplementationFlagsFor(method));
DefineParameters(builder, parameters);
SetBuilder(method, builder);
IMethod methodEntity = GetEntity(method);
if (methodEntity.IsDuckTyped)
{
builder.SetCustomAttribute(CreateDuckTypedCustomAttribute());
}
return builder;
}