.NET, Architecture, ALM, Cloud
Troisième et dernier partie de la série d'article sur les paramètres optionnels en C# 4.0 (1ère partie et 2ème partie).
Le but de cette troisième partie est d'implémenter une méthode d'extension permettant l'invocation en reflection des méthodes contenant des paramètres optionnels :
public static class MethodBaseExtension { public const string DEFAULT_VALUE = "DEFAULT_VALUE";
public static object InvokeWithOptParams(this MethodBase methodBase, object obj, params object[] parameters) { return InvokeWithOptParams(methodBase, obj, BindingFlags.Default, null, null, parameters); }
public static object InvokeWithOptParams(this MethodBase methodBase, object obj, BindingFlags invokeAttr, Binder binder, CultureInfo culture, params object[] parameters) { int parametersCount = parameters.Length; ParameterInfo[] methodParams = methodBase.GetParameters();
if (parameters.Length < methodParams.Length) Array.Resize<object>(ref parameters, methodParams.Length);
for (int i = 0; i < methodParams.Length; i++) { ParameterInfo parameterInfo = methodParams[i]; if (i >= parametersCount || parameters[i].ToString() == DEFAULT_VALUE) parameters[i] = (parameterInfo.IsOptional) ? parameterInfo.DefaultValue : GetDefaultValue(parameterInfo.ParameterType); } return methodBase.Invoke(obj, invokeAttr, binder, parameters, culture); }
public static object GetDefaultValue(Type type) { return typeof(MethodBaseExtension).GetMethod("GetDefaultValue", new Type[0] { }) .MakeGenericMethod(type).Invoke(null, new Type[0]); }
public static T GetDefaultValue<T>() { return default(T); } }
La méthode d'extension "InvokeWithOptParams" nous permet donc de définir les paramètres requis, récupérer la valeur par défaut d'un paramètre optionnel via la constante "DEFAULT_VALUE" ou tout simplement en ne spécifiant que les paramètres requis.
Reprenons notre méthode :
public void DoWork(int param1, bool checkData, string param3 = "defaultparam3", bool throwException = true) { //Add code... }
Exemples d'utilisation de la méthode "DoWork" :
method.InvokeWithOptParams(myClass, 2, true);
qui sera l'équivalent de :
method.Invoke(myClass, new object[] { 2, true, "defaultparam3", true });
2ème exemple :
method.InvokeWithOptParams(myClass, 2, true, MethodBaseExtension.DEFAULT_VALUE, false);
qui sera l'équivalent de :
method.Invoke(myClass, new object[] { 2, true, "defaultparam3", false });
3ème exemple :
method.InvokeWithOptParams(myClass);
qui sera l'équivalent de :
method.Invoke(myClass, new object[] { 0, false, "defaultparam3", true });