Отражение статического перегруженного метода с использованием параметра out

У меня возникли проблемы с вызовом перегруженного статического метода с параметром 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 () ?

Я знаю, что по этой теме есть много вопросов, но большинство они включают статические универсальные методы или статические методы, которые не перегружены. Этот вопрос похож, но не повторяется.

14
задан Community 23 May 2017 в 11:53
поделиться