2009-02-20 13 views
45

un codice di esempio quello che cerco di fare sarà sicuramente fare di meglio il mio inglese:MethodInfo.Invoke con Parametro fuori

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; 
} 

Purtroppo il metodo TryParse ha bisogno di un parametro out quindi questo non funziona. qualche idea su come risolvere questo?

(ps .: would'nt questo sia un ottimo esempio per la digitazione di anatra -? Perché so ogni numericType ha un "TryParse" o mi sbaglio?)

+0

si dovrebbe essere in grado di analizzare qualsiasi tipo numerico da raddoppiare, quindi double.TryParse() dovrebbe farlo qui? –

+2

Per le persone che vengono qui in futuro: @Lars, non tutti i numeri numerici possono essere analizzati per raddoppiare senza perdere la precisione, in particolare il "decimale" è il peggiore trasgressore. – Crisfole

+0

.NET Framework ha funzionalità incorporate per conversioni di tipo IConvertible: [TypeConverter] (https://msdn.microsoft.com/en-us/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/it-it/library/system.convert.changetype (v = vs.110) .aspx), [Confronto] (https://stackoverflow.com/questions/7010669/typeconverter-vs-convert-vs -targettype-parse) – Almis

risposta

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

Se qualcuno si chiede perché funzioni, l'array di parametri è un array di oggetti e l'oggetto nullo all'indice 1 viene sostituito dal valore del parametro out. Se metti una variabile nell'array (ad esempio, nuovo oggetto [] {"123", myVar};) quindi dopo Invoke il valore di myVar non cambierà, ma i parametri [1] conterranno ancora il valore del parametro out. – grahamesd

Problemi correlati