Tengo algunos problemas para invocar un método estático sobrecargado con un parámetro de salida por reflexión y agradecería algunos indicadores.Reflexión sobre un método estático sobrecargado usando un parámetro de salida
Estoy buscando crear dinámicamente un tipo como System.Int32
o System.Decimal
, y luego invocar el método estático TryParse(string, out x)
en él.
El código de abajo tiene dos problemas:
t.GetMethod("TryParse", new Type[] { typeof(string), t })
no puede devolver el MethodInfo esperomi.Invoke(null, new object[] { value.ToString(), concreteInstance })
parece tener éxito, pero no establece el parámetro a caboconcreteInstance
al valor analizado
Entretejido en esta función se puede ver un código temporal que demuestra lo que debería suceder si el parámetro type
se configuró en System.Decimal
.
public static object Cast(object value, string type)
{
Type t = Type.GetType(type);
if (t != null)
{
object concreteInstance = Activator.CreateInstance(t);
decimal tempInstance = 0;
List<MethodInfo> l = new List<MethodInfo>(t.GetMethods(BindingFlags.Static | BindingFlags.Public));
MethodInfo mi;
mi = t.GetMethod("TryParse", new Type[] { typeof(string), t }); //this FAILS to get the method, returns null
mi = l.FirstOrDefault(x => x.Name == "TryParse" && x.GetParameters().Length == 2); //ugly hack required because the previous line failed
if (mi != null)
{
try
{
bool retVal = decimal.TryParse(value.ToString(), out tempInstance);
Console.WriteLine(retVal.ToString()); //retVal is true, tempInstance is correctly set
object z = mi.Invoke(null, new object[] { value.ToString(), concreteInstance });
Console.WriteLine(z.ToString()); //z is true, but concreteInstance is NOT set
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
return concreteInstance;
}
return value;
}
¿Qué necesito hacer para asegurarse de que mi t.GetMethod()
llamada devuelve el MethodInfo correcta? ¿Qué debo hacer para tener el concreteInstance
configurado correctamente en mi llamada mi.Invoke()
?
Sé que hay un montón de preguntas sobre este tema, pero la mayoría de ellas involucran métodos estáticos genéricos o métodos estáticos que no están sobrecargados. This question es similar, pero no es un duplicado.
Excelente respuesta, gracias @Jason. – slugster