Создание атрибутов для вашего метода на лету возможно, но сложно. Вам лучше найти другой подход.
Атрибуты (например, [TestFixture]
) того типа, который у вас есть, читаются компилятором, когда ваш код компилируется и автоматически вставляется в ваш код.
Чтобы сгенерировать свои собственные атрибуты для классов, вам нужно использовать что-то вроде Reflection.Emit, чтобы модифицировать сгенерированные сборки как шаг после сборки для проекта. Это похоже на непосредственное написание ассемблера (вы создаете MSIL), что может быть весело, но не просто и затруднит поддержку вашего кода!
Альтернативный подход может заключаться в том, чтобы перечисление управляло контрольными случаями и имело метод, который проверяет перечисление и возвращает соответствующие данные:
public enum TestController
{
Value1,
Value2,
Value3
}
[TestFixture(TestController.Value1)]
[TestFixture(TestController.Value2)]
[TestFixture(TestController.Value3)]
public class MyTestFixture
{
public MyTestFixture(TestController testController)
{
var dataForTest = GetDataForTest(testController);
}
...
}
Метод GetDataForTest()
будет тогда иметь своего рода оператор переключения для генерации данных.
Альтернативным подходом может быть использование типа, а не перечисления, затем создание экземпляра типа в методе GetDataForTest()
и вызов метода фабрики - но я думаю, что это может быть немного слишком сложно.