.NET Отражение всех параметров метода

Можно ли получить имя параметра (где у меня parmName ниже)? Или, возможно, в коде MSIL есть только относительные позиции, без абсолютных имен парм?

У меня есть необычный случай использования HIP в Microsoft Host Integration Server. Когда поля имеют значение NULL и ошибка возвращается к CICS (на мэйнфрейме), возникает ошибка "CALL TO VERIFYINVOKEPARAMS FAILED". Я жестко запрограммировал решение, но пытался найти общее решение, которое подойдет для любой подпрограммы HIP.

Спасибо,

Нил Уолтерс

    // check for null values in any of the parameters 
    MethodBase method = MethodBase.GetCurrentMethod();
    //string key = method.Name + "(";
    for (int i = 0; i < method.GetParameters().Length; i++)
    {
        if (method.GetParameters().GetValue(i).GetType() == typeof(String))
        {
            if (method.GetParameters().GetValue(i) == null)
            {
                string parmName = " Parm #" + i; 
                msg = "Value of return variable " + parmName + " is null (should be blanks)";
                System.Diagnostics.EventLog.WriteEntry("LOGGER", msg, 
                    System.Diagnostics.EventLogEntryType.Error);

            }
        }
    }

Дополнительная информация: я звоню в BizTalk Orch, опубликованную как веб-сервис WCF. При получении ошибок некоторые поля не сериализуются обратно в вышеуказанную программу. Вот как значения должны быть NULL в первую очередь. Но приложение CICS/, которое вызывает мою HIS/HIP программу, не любит нули.

Ответ 1

Попробуйте следующее:

var parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo parameter in parameters)
{
    Console.WriteLine(parameter.Name);
}

Ответ 2

Я думаю, что эта строка не делает то, что вы думаете, что это будет делать.


if (method.GetParameters().GetValue(i) == null)

GetValue не получит значение параметра, переданного методу. GetValue (i) - это метод класса Array, который просто возвращает значение i-го индекса в массив, который является ParameterInfo. Класс ParameterInfo не имеет никакой информации о значении, с которым был вызван метод. Я сомневаюсь, что он когда-либо вернет нуль.

Ответ 3

public struct Argument
{
    public String Name;
    public String Value; 
}

public void Method(Argument[] arguments)
{
    for (int i = 0; i < arguments.Length; i++)
    {
        var v = arguments[i].Value;
        if (v == null)
        {
           var message = "Param " + arguments[i].Name + " cannot be null.";
           EventLog.WriteEntry("LOGGER", message, EventLogEntryType.Error);
        }          
    }    
}