Отличный ответ, спасибо @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)

Решение Вопроса

BindingFlags и использоватьType.MakeByRefType заout а такжеref параметры. Одна секунда, и у меня будет пример кода для вас.

Например,

MethodInfo methodInfo = typeof(int).GetMethod(
    "TryParse",
    BindingFlags.Public | BindingFlags.Static,
    Type.DefaultBinder,
    new[] { typeof(string), typeof(int).MakeByRefType() },
    null
);

Я должен отметить, что вызывать это тоже немного сложно. Вот как ты это делаешь.

string s = "123";
var inputParameters = new object[] { "123", null };
methodInfo.Invoke(null, inputParameters);
Console.WriteLine((int)inputParameters[1]);

Первыйnull потому что мы вызываем статический метод (нет объекта, «получающего» этот вызов).null вinputParameters будет "заполнен" для насTryParse с результатом разбора (этоout параметр).

 slugster19 янв. 2011 г., 22:16
Отличный ответ, спасибо @Jason.

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