У меня есть собственный атрибут, и я хотел бы иметь возможность проверять подпись элемента, к которому он прикреплен, из кода атрибута.
Это было бы легко из-за пределов атрибута, но это особенно необходимобыть внутри атрибута. Я пробовал обходить 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" };
}