.NET, Architecture, ALM, Cloud

Publicité

C# 4.0 : Invoke Optional Parameter

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 }); 
Publicité
Retour à l'accueil
Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
L
<br /> je tiens à vous féliciter pour le travail formidable que vous effectuer à tarves ce blog.<br />
Répondre
L
<br /> blog trés intéressant!<br />
Répondre