Могут ли пользовательские атрибуты C # получить параметры метода, к которому они присоединены? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть собственный атрибут, и я хотел бы иметь возможность проверять подпись элемента, к которому он прикреплен, из кода атрибута.

Это было бы легко из-за пределов атрибута, но это особенно необходимобыть внутри атрибута. Я пробовал обходить StackTrace, но этот метод не подходит для метода, к которому я присоединяюсь, и CallerMemberName также не дает мне то, что мне нужно.


public class MyAttribute : Attribute
{
  public void ReadDetails()
  {
    MethodInfo attachee = ???; // TODO

    Console.WriteLine(attachee.MethodName); // expect "Baa"
    Console.WriteLine(attachee.GetParameters()[0].ParameterType.Name); // expect "int"
    Console.WriteLine(attachee.GetParameters()[0].Name); // expect "a"
  }
}

public class foo
{
  [MyAttribute]
  public void Baa(int a, string b) {}
}

Для контекста это поддержка некоторого автоматического тестирования -У меня есть электронная таблица данных, описывающая пользовательский интерфейс, и методы тестирования с меньшим количеством параметров, чем у электронной таблицы, имеют столбцы. У меня есть пользовательский атрибут, который подклассов NUnit TestCaseSourceAttribute и читает электронную таблицу, но мне нужно отфильтровать столбцы только для того, что нужно тесту. Например, у меня будут такие тесты, как:

[SpreadsheetDrivenTests("ui.xlsx")]
public void TestButtonText(string buttonId, string expectedText) {}

[SpreadsheetDrivenTests("ui.xlsx")]
public void TestButtonVisibility(string buttonId, bool expectedVisible) {}

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

[SpreadsheetDrivenTests("ui.xlsx", "buttonId", "expectedText")]
public void TestButtonText(string buttonId, string expectedText) {}

[SpreadsheetDrivenTests("ui.xlsx", typeof(this), nameof(ParameterGenerator)]
public void TestButtonVisibility(string buttonId, bool expectedVisible) {}

public static string[] ParameterGenerator()
{
  return { "buttonId", "expectedVisible" };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...