Ответ 1
Попробуйте следующее:
var parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo parameter in parameters)
{
Console.WriteLine(parameter.Name);
}
Можно ли получить имя параметра (где у меня 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 программу, не любит нули.
Попробуйте следующее:
var parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo parameter in parameters)
{
Console.WriteLine(parameter.Name);
}
Я думаю, что эта строка не делает то, что вы думаете, что это будет делать.
if (method.GetParameters().GetValue(i) == null)
GetValue не получит значение параметра, переданного методу. GetValue (i) - это метод класса Array, который просто возвращает значение i-го индекса в массив, который является ParameterInfo. Класс ParameterInfo не имеет никакой информации о значении, с которым был вызван метод. Я сомневаюсь, что он когда-либо вернет нуль.
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);
}
}
}