Я пытаюсь написать код, который будет выводить типы из списка параметров, а затем вызывать метод, соответствующий этим параметрам. Это работает очень хорошо, за исключением случаев, когда в списке параметров есть значение 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*/
также работала.