Считать значение атрибута из метода с параметрами - PullRequest
0 голосов
/ 08 декабря 2018

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

На мой первоначальный вопрос о том, как прочитать значение атрибута из метода, был дан ответ на этот вопрос( Чтение значения атрибута метода )

Вот код, который работал

public static void WriteStepNamesOfMethodToReport(Type classType, string methodName)
{
    MethodInfo methodInfo = classType.GetRuntimeMethod(methodName, new Type[] { });
    Attribute[] attributeList = (System.Attribute[])methodInfo.GetCustomAttributes(typeof(Step), true);

    GaugeMessages.WriteMessage("---------------------");
    foreach (Attribute attr in attributeList)
    {
        Step a = (Step)attr;
        GaugeMessages.WriteMessage("Executed Step - {0}", a.Names.ElementAt(0));
    }
    GaugeMessages.WriteMessage("---------------------");
}

Вот так я настраиваю переменные для отправки(и да, я мог бы сделать эту одну строку, но я определяю ее в одном месте и использую ее во многих так, как это и должно быть)

Type classType = typeof(AClassInTheProject);
GenericHelpers.WriteStepNamesOfMethodToReport(classType, nameof(AMethodNameFrom_AClassInTheProject));

Строка кода, начинающаяся с атрибута [] attribute .... выдает ошибку, когда я пытаюсь предоставить метод (methodName), в котором есть параметры.Когда я вхожу в «methodName», это всегда так (без скобок, так как они не будут приняты).Возникшая ошибка говорит:

Object reference not set to an instance of an object.

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

Вот базовая схема класса, который я использую (такая же настройка, как и у всех непараметрических методов, которые работают).

class AClassInTheProject
{
    [Step("Perform the Step For AMethodNameOne"]
    AMethodNameOne() // This one works
    {
        // Code
    }

    [Step("Perform the Step For AMethodNameTwo"]
    AMethodNameTwo(string parameterA) // This one doesn't work
    {
        // Code
    }
}

Справочная информация: это для проекта GIAG UIAutomation.Мне нужно выполнить некоторые шаги в автоматизации пользовательского интерфейса в логических условиях (если выполнить шаг ...), для которых датчик не обеспечивает поддержку.Все выполненные шаги должны быть выведены в окончательный отчет (GaugeMessages .....).Это проект на C #.Моя потребность не распространена среди людей в сообществе Gauge, поэтому она не была сочтена достаточно приоритетной, чтобы включить исправление в исходный код (именно поэтому я делаю этот обходной путь).Надеюсь, это достаточно подробно.

1 Ответ

0 голосов
/ 08 декабря 2018

В корне это проблема NullReferenceException.

Этот вызов GetRuntimeMethod говорит: «Дайте мне метод с этим именем без параметров».Он возвращает null, потому что метод, который вы хотите, имеет параметры.Он работает, когда вы удаляете параметр, потому что тогда он соответствует условию «без параметров».

Если вам нужны конкретные типы параметров, укажите их, например, new Type[] { typeof(string) }.

Если вы хотите любое числои тип параметров, используйте перегрузку GetMethod, которая не принимает Type[] (при условии, что есть только один метод с таким именем, в противном случае вы получите другое исключение), или используйте GetMethods и найдите нужный методиз массива он возвращает.

...