如何获取具有重复项的方法的属性值?

时间:2014-04-18 01:18:59

标签: c# linq attributes coded-ui-tests

我有一些代码根据我的CodedUI测试项目的属性生成报告。我希望能够将TestCategoryAttribute添加到此报告中,但我不知道如何调整我的代码以允许重复属性,如下所示:

[TestMethod]
[TestCategory("Smoke")]
[TestCategory("Feature1")]
public void CodedUITest()
{
}

当我只有一个TestCategory但不能使用多个测试类别时,下面的代码有效:

//Other code above to find all CodedUI classes and all public, nonstatic methods with the TestMethod attribute

//find method with testcategory attribute
if (attrs.Any(x => x is TestCategoryAttribute))
{
   var testcategoryAttr = (TestCategoryAttribute)attrs.SingleOrDefault(x => x is TestCategoryAttribute);
   string testCategories = string.Join(", ", testcategoryAttr.TestCategories.Select(v => v.ToString()));
}

3 个答案:

答案 0 :(得分:1)

SingleOrDefault替换为Where

var testcategoryAttrs = attrs.Where(x => x is TestCategoryAttribute)
                             .Select(x => ((TestCategoryAttribute)x).TestCategory);
string testCategories = string.Join(", ", testcategoryAttrs.ToArray());

我不知道TestCategoryAttribute中的媒体资源名称,所以我在此示例中使用了TestCategory

答案 1 :(得分:0)

如果有多个项目与您的条件相匹配,则

SingleOrDefault会抛出异常。在这种情况下,您有两个属性,这就是您获得异常的原因。

如果您只想获得一个项目,请使用FirstOrDefault。它返回第一个用条件计算的项,否则它返回 null 所以你在建立FirstOrDefault的返回结果时应该小心,你可能想在演员之前添加一个空查,由于您使用Any方法并确保至少存在一个TestCategoryAttribute,因此在这种情况下不需要进行空检查。

var testcategoryAttr = (TestCategoryAttribute)attrs
                       .FirstOrDefault(x => x is TestCategoryAttribute);

答案 2 :(得分:0)

这是最终对我有用的解决方案。我问了一个实际的开发人员这个问题,而不是试图弄清楚自己(我是QA):)我必须添加一些特殊的逻辑来正确格式化字符串,因为attr.TestCategories对象是一个List。

//find method with testcategory attribute
if (attrs.Any(x => x is TestCategoryAttribute))
{
    var testCategoryAttrs = attrs.Where(x => x is TestCategoryAttribute);
    if (testCategoryAttrs.Any())
    {
        foreach (var testCategoryAttr in testCategoryAttrs)
        {
            TestCategoryAttribute attr = (TestCategoryAttribute)testCategoryAttr;
            testCategories += string.IsNullOrEmpty(testCategories)
                ? string.Join(", ", attr.TestCategories)
                : string.Format(", {0}", string.Join(", ", attr.TestCategories));
        }
    }                               
}