Получение значения парм с использованием отражения

Как я могу получить значения парм (в цикле с использованием отражения). В предыдущем вопросе кто-то показал мне, как петля через пармы, используя отражение.

static void Main(string[] args)
{
    ManyParms("a","b","c",10,20,true,"end");
    Console.ReadLine(); 
}

static void ManyParms(string a, string b, string c, int d, short e, bool f, string g)
{
    var parameters = MethodBase.GetCurrentMethod().GetParameters();
    foreach (ParameterInfo parameter in parameters)
    {
        string parmName = parameter.Name;
        Console.WriteLine(parmName); 
        //Following idea required an object first 
        //Type t = this.GetType();
        //t.GetField(parmName).GetValue(theObject));

    }
}

Если вы должны знать, почему я хочу это сделать, см. здесь: .NET Отражение всех параметров метода


Спасибо всем - похоже, в Python, PERL, PHP это было бы легко.
Хотя это может и не быть отражением, если я использую отражение для получения имени поля, кажется, что будет простой динамический способ получить значение на основе имени. Я еще не пробовал AOP (Aspect Oriented Programming) решения. Это одна из тех вещей, которые, если я не смогу сделать это через час или два, я, вероятно, этого не сделаю.

Ответ 1

Вы не можете, в принципе, по крайней мере, не зависеть от отладчика/профилирующего API.

В теории может быть какой-то способ StackFrame класс, отображающий значения параметров, но это не так - и я подозреваю, что в для этого вам придется удалить несколько оптимизаций.

Ответ 2

Вы можете взломать этот путь, создав анонимный тип внутри вашего метода и воспользовавшись инициализаторами проекций. Затем вы можете опросить свойства анонимного типа с помощью отражения. Например:

static void ManyParms(
    string a, string b, string c, int d, short e, bool f, string g)
{
    var hack = new { a, b, c, d, e, f, g };

    foreach (PropertyInfo pi in hack.GetType().GetProperties())
    {
        Console.WriteLine("{0}: {1}", pi.Name, pi.GetValue(hack, null));
    }
}

Ответ 3

Вы не можете через отражение, и вы не должны делать это в любом случае.

Если вам нужна такая функциональность, используйте прокси-сервер, например. через реализацию RealProxy, которая перехватывает вызов для вас. Затем вы можете проверить и изменить любой параметр до фактического вызова (или даже не выполнять оригинальный вызов вообще, что до вас).

Ответ 4

Вы не можете этого сделать. Отражение работает с метаданными, внедренными во время компиляции, и в то время значения параметров неизвестны.

Ответ 5

Считаете ли вы использование АОП, например PostSharp?

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

Ответ 6

Вы не можете получить значение параметров метода с помощью отражения. Потому что отражение возвращает информацию метаданных. Если вы хотите получить значение определенного поля или свойства, вам нужно также использовать экземпляр (как вы уже знаете).

Существует несколько способов получить значение параметра, используя внутреннюю сантехнику платформы .NET, а именно API-интерфейс профилировщика и API-интерфейс отладчика.

Вы можете использовать AOP для того, что вы пытаетесь сделать, есть проект Codeplex под названием CThru, который может вам помочь - используя CThru, вы можете перехватить метод при его вызове и получить параметры, с которыми он был вызван.