Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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);
        }