private void EmitMethodArguments(Candidate found, ILGenerator il) { for (int i = 0; i < _arguments.Length; ++i) { il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Ldelem_Ref); Type paramType = found.GetParameterType(i); switch (found.ArgumentScores[i]) { case PromotionScore: il.Emit(OpCodes.Castclass, typeof(IConvertible)); il.Emit(OpCodes.Ldnull); il.Emit(OpCodes.Callvirt, GetPromotionMethod(paramType)); break; case ImplicitConversionScore: EmitCastOrUnbox(il, GetArgumentType(i)); il.Emit(OpCodes.Call, found.GetArgumentConversion(i)); break; default: EmitCastOrUnbox(il, paramType); break; } } }
private object AdjustArgument(Candidate candidate, int argumentIndex, object argument) { switch (candidate.ArgumentScores[argumentIndex]) { case PromotionScore: return(PromoteNumericArgument(candidate.GetParameterType(argumentIndex), argument)); case ImplicitConversionScore: return(candidate.GetArgumentConversion(argumentIndex).Invoke(null, new object[] { argument })); } return(argument); }