Отличный ответ, спасибо @Jason.

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

В этой функции вы можете увидеть временный код, демонстрирующий, что должно произойти, если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<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;
}

Что мне нужно сделать, чтобы мойt.GetMethod() вызов возвращает правильный MethodInfo? Что мне нужно сделать, чтобы иметьconcreteInstance правильно установлен в моемmi.Invoke() вызов?

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

Ответы на вопрос(1)

Ваш ответ на вопрос