Можно ли получить значение пользовательского атрибута NUnit PropertyAttribute с помощью отражения? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть что-то вроде следующего

[TestFixture]
public class Test
{
    [Test]
    [Property("Test", "TEST-1234")]
    public void TestOne()
    {
        Assert.IsTrue(true);
    }

    [Test]
    [Property("Test", "TEST-5678")]
    public void TestTwo()
    {
        Assert.IsTrue(true);
    }
}

Мне нужно получить значение атрибута Test т.е. мне нужно получить TEST-1234 с помощью отражения. Я знаю, что можно получить его во время выполнения с чем-то вроде TestContext.CurrentContext.Test.Properties["Test"]), но это мне не помогает.

Я пробовал несколько методов, таких как

test.GetCustomAttributes(typeof(NUnit.Framework.PropertyAttribute)).ToList()[0]

, которые получают сам объект атрибута, но я не могу получить доступ к самому значению, это возможно?

1 Ответ

0 голосов
/ 14 февраля 2020

Итак, давайте предположим, что у вас есть массив атрибутов свойств, найденных в данном методе. Вы получили их с помощью отражения, указав тип PropertyAttribute, чтобы вы знали, что это то, что они есть, хотя массив Attribute[].

Так что вам нужно найти все атрибуты (или первый атрибут, если вы просто хотите 1) со свойством Name «Test», а также со значением, присвоенным этому свойству.

[Кстати, «Test» кажется мне довольно дурным именем, поскольку в NUnit так много вещей, которые называются «Test» и ваш собственный тестовый код, вероятно, также. Но мы останемся с этим именем для примера.]

Вам нужно сделать что-то вроде этого ...

for each (PropertyAttribute attr in attrs) // attrs filled by you already
{
     if (attr.Name == "Test")
         testValue = attr.Value;

     // Process the value as you want. If there's just one and this is in
     // a function call, you can return it. If you are doing something else,
     // do it here and then `break` to exit the loop
}

Вы можете сделать это с меньшим количеством кода, используя System.Linq, но Я думаю, что l oop поможет вам более ясно увидеть, что нужно сделать.

...