У меня возникли проблемы с вызовом перегруженного статического метода с параметром out через отражение, и я хотел бы получить несколько указателей.
Я пытается динамически создать такой тип, как System.Int32
или System.Decimal
, а затем вызвать на нем статический метод TryParse (string, out x)
.
В приведенном ниже коде есть две проблемы:
t.GetMethod ("TryParse", new Type [] {typeof (string), t})
не может вернуть MethodInfo, я ожидаю
mi. Invoke (null, new object [] {value.ToString (), specificInstance})
кажется успешным, но не устанавливает выходной параметр creteInstance
в проанализированное значение
Вмешано в эту функцию вы можете увидеть временный код, демонстрирующий, что должно произойти, если для параметра type
задано значение 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 l = new List(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;
}
Что мне нужно сделать, чтобы убедиться, что мой t .GetMethod ()
возвращает правильный MethodInfo? Что мне нужно сделать, чтобы правильно установить конкретный экземпляр
в моем вызове mi.Invoke ()
?
Я знаю, что по этой теме есть много вопросов, но большинство они включают статические универсальные методы или статические методы, которые не перегружены. Этот вопрос похож, но не повторяется.