2009-02-20 5 views
45

un code d'exemple ce que j'essaie de faire va sûrement faire mieux que mon anglais:MethodInfo.Invoke avec paramètre sur

public bool IsNumericValueInBounds (string value, Type numericType) 
{ 
    double d = double.NaN;  

    bool inBounds = (bool)numericType.GetMethod ("TryParse").Invoke (null, new object[] { value, d }); 

    return inBounds; 
} 

Malheureusement, la méthode TryParse a besoin d'un paramètre de telle sorte que cela ne fonctionne pas. des idées pour résoudre ce problème?

(ps .: would'nt ce un bon exemple pour le typage de canard - parce que je sais que chaque numericType a un « TryParse » ou je me trompe?)

+0

Vous devriez être capable d'analyser tout type numérique à doubler, donc double.TryParse() devrait le faire ici? –

+2

Pour les gens qui viennent ici dans le futur: @Lars, tous les chiffres ne peuvent pas être doublés sans doubler sans perdre de précision, le "décimal" en particulier est le pire délinquant ici. – Crisfole

+0

.NET Framework dispose d'une fonctionnalité intégrée pour les conversions de type IConvertible: [TypeConverter] (https://msdn.microsoft.com/fr-fr/library/system.componentmodel.typeconverter (v = vs.110) .aspx) , [GetConverter] (https://msdn.microsoft.com/en-us/library/system.componentmodel.typedescriptor.getconverter (v = vs.110) .aspx), [Convert.ChangeType] (https: // msdn .microsoft.com/fr-fr/library/system.convert.changetype (v = vs.110) .aspx), [Comparaison] (https://stackoverflow.com/questions/7010669/typeconverter-vs-convert-vs -targettype-parse) – Almis

Répondre

89
public static bool TryParse(string text, out int number) { .. } 

MethodInfo method = GetTryParseMethodInfo(); 
object[] parameters = new object[]{ "12345", null } 
object result = method.Invoke(null, parameters); 
bool blResult = (bool)result; 
if (blResult) { 
    int parsedNumber = (int)parameters[1]; 
} 
+23

Si quelqu'un se demande pourquoi cela fonctionne, le tableau de paramètres est un tableau d'objets et l'objet nul à l'index 1 est remplacé par la valeur du paramètre out. Si vous mettez une variable dans le tableau (par exemple, nouvel objet [] {"123", myVar};), après Invoke, la valeur de myVar ne changera pas mais les paramètres [1] contiendront toujours la valeur du paramètre out. – grahamesd

Questions connexes