C# 是否可以通过反射获取NUnit自定义属性PropertyAttribute的值?

C# 是否可以通过反射获取NUnit自定义属性PropertyAttribute的值?,c#,nunit,nunit-3.0,C#,Nunit,Nunit 3.0,我有如下的东西 [TestFixture] public class Test { [Test] [Property("Test", "TEST-1234")] public void TestOne() { Assert.IsTrue(true); } [Test] [Property("Test", "TEST-5678")] public void TestTwo() { Assert

我有如下的东西

[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]

这会让我得到属性对象本身,但我无法访问值本身,这可能吗?

因此,假设您有一个属性数组,可以在给定的方法上找到。您通过反射指定类型
PropertyAttribute
来获得它们,因此您知道它们是什么,即使数组是
Attribute[]

因此,您需要查找具有
名称
属性“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
使用更少的代码来完成,但我认为循环将帮助您更清楚地看到必须完成的操作。

当然这是可能的,但我们需要更多的信息。如果您不想在运行时通过
TestContext
获取它,那么您希望如何以及在何处获取它?答案会相应地有所不同。@Charlie我在一个控制台应用程序中工作,该程序基本上执行
nunit3 console.exe
,然后将结果发布到跟踪系统。出于这些目的,我需要从指定的方法(TestCase)中提取问题编号,该方法用
属性
属性修饰。例如,我正在加载
dll
,提取方法并通过
GetCustomAttributes
获取属性,但我找不到从“Test”属性获取值的方法。希望能有帮助。我以前尝试过这个,但不幸的是PropertyAttribute,它是一个NUnit构造,不包含
Name
Value
属性。看起来有点笨重,但实际工作是
attribute.properties[“Test”][0]
是的,对不起。。。那是“论坛代码”。。。fwiw
PropertiesAttribute
一开始只有一个名称和值,但经过改进,一个属性可以携带多个不同的属性,每个属性内部可以有多个值。。。从中你可以得到奇怪的语法。而且,通常的警告适用于。。。您正在使用一个内部实现细节,该细节以前已经更改过,可能会再次更改。