2009-02-20 21 views
45

un código de ejemplo de lo que trato de hacer seguramente hacer algo mejor que mi Inglés:MethodInfo.Invoke con Parámetro fuera

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

Desafortunadamente el método TryParse necesita un parámetro de salida por lo que esto no funciona. alguna idea de cómo resolver esto?

(ps .: would'nt este será un buen ejemplo para la tipificación de pato - porque sé que cada numericType tiene un "TryParse" o me equivoco?)

+0

Usted debe ser capaz de analizar cualquier tipo numérico a doble, por lo que double.TryParse() debería hacerlo aquí? –

+2

Para las personas que vienen aquí en el futuro: @Lars, no todos los números se pueden analizar para doblar sin perder precisión, 'decimal' en particular es el peor infractor aquí. – Crisfole

+0

.NET Framework tiene funcionalidad incorporada para las conversiones de 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/es-us/library/system.convert.changetype (v = vs.110) .aspx), [Comparación] (https://stackoverflow.com/questions/7010669/typeconverter-vs-convert-vs -targettype-parse) – Almis

Respuesta

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

En caso de que alguien se pregunte por qué funciona esto, la matriz de parámetros es una matriz de objetos y el objeto nulo en el índice 1 se reemplaza por el valor del parámetro de salida. Si coloca una variable en la matriz (por ejemplo, nuevo objeto [] {"123", myVar};) luego de Invocar, el valor de myVar no cambiará, pero los parámetros [1] aún contendrán el valor del parámetro de salida. – grahamesd

Cuestiones relacionadas