Обработка нулевых параметров при вызове метода с использованием Reflection

Я пытаюсь написать код, который будет определять типы из списка параметров, а затем вызывать метод, соответствующий этим параметрам. Это работает очень хорошо, за исключением случаев, когда в списке параметров есть значение null .

Мне интересно, как я могу заставить вызов Type.GetMethod соответствовать функции / перегрузке , даже с параметром null в списке параметров.

object CallMethodReflection(object o, string nameMethod, params object[] args)
{
    try
    {
        var types = TypesFromObjects(args);
        var theMethod = o.GetType().GetMethod(nameMethod, types);
        return (theMethod == null) ? null : theMethod.Invoke(o, args);
    }
    catch (Exception ex)
    {
        return null;
    }
}
Type[] TypesFromObjects(params object[] pParams)
{
    var types = new List<Type>();
    foreach (var param in pParams)
    {
        types.Add((param == null) ? null : param.GetType());
    }
    return types.ToArray();
}

Основная проблемная строка - это types.Add ((param == null)? Null: param.GetType ()); , что приведет к сбою вызова GetMethod со значением null в массиве типов.

void Function1(string arg1){ }
void Function1(string arg1, string arg2){ }
void Function1(string arg1, string arg2, string arg3){ }
void Function2(string arg1){ }
void Function2(string arg1, int arg2){ }
void Function2(string arg1, string arg2){ }

/*1*/ CallMethodReflection(obj, "Function1", "String", "String"); // This works
/*2*/ CallMethodReflection(obj, "Function1", "String", null); // This doesn't work, but still only matches one overload
/*3*/ CallMethodReflection(obj, "Function2", "String", "String"); // This works
/*4*/ CallMethodReflection(obj, "Function2", "String", null); // This doesn't work, and I can see why this would cause problems

В основном я пытаюсь определить, как изменить свой код, чтобы строка / * 2 * / также работала.

8
задан palswim 12 May 2011 в 18:18
поделиться