public void SetupParameters(MethodBuilder methodBuilder)
{
if (methodToOverride.IsGenericMethod)
{
Type[] genericArguments = methodToOverride.GetGenericArguments();
string[] names = genericArguments
.Select(t => t.Name)
.ToArray();
GenericTypeParameterBuilder[] builders = methodBuilder.DefineGenericParameters(names);
for (int i = 0; i < genericArguments.Length; ++i)
{
builders[i].SetGenericParameterAttributes(genericArguments[i].GenericParameterAttributes);
var constraintTypes = genericArguments[i].GetGenericParameterConstraints();
builders[i].SetInterfaceConstraints(constraintTypes.Where(t => t.IsInterface).ToArray());
foreach (Type type in constraintTypes.Where(t => !t.IsInterface))
{
builders[i].SetBaseTypeConstraint(type);
}
}
for(int i = 0; i < genericArguments.Length; ++i)
{
genericMethodParameters.Add(new KeyValuePair<Type, Type>(genericArguments[i], builders[i].UnderlyingSystemType));
}
}
}