Одним из способов было бы использование отражения для вызова метода с упорядоченным массивом параметров, где заданные пользователем значения используются там, где это возможно, и Type.Missing
используется там, где не было указано значение:
public static object InvokeWithOrderedParameters(object instance, string methodName,
IDictionary<string, object> namedParameters)
{
// Get the method to invoke
var method = instance.GetType().GetMethod(methodName);
// Get an array of ordered parameter values based on the specified named
// parameters, with a default value of "Type.Missing" for any missing names
var orderedParams = method.GetParameters().Select(param =>
{
object value;
// Set the value from our dictionary, or if that fails use "Type.Missing"
if (!namedParameters.TryGetValue(param.Name, out value))
{
value = Type.Missing;
}
return value;
}).ToArray();
// Invoke the method with the ordered parameters and return the value
return method.Invoke(instance, orderedParams);
}
С помощью этого метода мы можем передать экземпляр нашего типа, имя вызываемого метода и Dictionary<string, object>
именованных параметров и их значений, и он вернет результат вызова этого метода с параметрами, которые мы указали.
В качестве примера, вот метод, который имеет значения по умолчанию для всех своих параметров:
public class ThirdParty
{
public string MethodA(string arg1 = "defaultArg1", string arg2 = "defaultArg2",
string arg3 = "defaultArg3")
{
return $"{arg1}, {arg2}, {arg3}";
}
}
И мы можем использовать наш метод отражения, чтобы вызывать его с таким количеством именованных параметров, как нам нравится. Ниже я просто даю значение для второго параметра:
public static void Main(string[] args)
{
var namedParameters = new Dictionary<string, object>
{
{"arg2", "custom Arg 2 value"}
};
var instance = new ThirdParty();
var result = InvokeWithOrderedParameters(instance, "MethodA", namedParameters);
Console.WriteLine(result.ToString());
GetKeyFromUser("\nDone! Press any key to exit...");
}
Вывод
Как видите, указанное нами значение было передано, и значение по умолчаниюзначения использовались там, где мы ничего не указывали: