使用Reflection在测试方法中读取Category属性

时间:2016-08-05 22:10:05

标签: c# winforms c#-4.0 reflection

我正在尝试使用TestMethod自定义属性的类别属性添加测试方法,方法是使用反射读取.dll,如下所示:

如果测试方法是:

[TestMethod, Category("xyz"), Category("abc")]
public void VerifySomething()
{
   //some code
}

我正在使用这样的反射来阅读.dll:

 Assembly _assembly = Assembly.LoadFile(AssembleyPath);
            Type[] types = _assembly.GetExportedTypes();
            foreach (Type type in types)
            {
                Attribute _classAttribute = type.GetCustomAttribute(typeof(TestClassAttribute));
                if (_classAttribute != null)
                {
                    TreeNode _n = new TreeNode();
                    _n.Text = type.Name;
                    if (type.Name.ToLower().Contains("testbase"))
                        // For exculding test base class from tree node list
                        continue;
                    MemberInfo[] members =
                        type.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod);
                    foreach (MemberInfo member in members)
                    {

                            Attribute _att = member.GetCustomAttribute(typeof(TestMethodAttribute));
                            if (_att != null)
                            {
                                TestMethod _t = new TestMethod(member.Name);

                            }

                    }
                 }
            }

使用此我无法添加在树视图节点内按特定类别过滤的测试方法。 基本上我想要的是从dll读取TestCategoryAttribute,它具有类似“xyz”或“abc”的值,如我上面提到的示例,然后基于过滤器(TestCategoryAttribute)值,我想从dll加载方法并将它们添加到树视图节点。任何人都可以指导我如何实现这一目标。

1 个答案:

答案 0 :(得分:0)

这是从Reflection获取TestMethod作为MethodInfo的方法。

var _t= typeof(testClass).GetMethod(methodName); // testClass should be the type in your foreach

鉴于TestMethod _t(假设一切正常),您可以使用以下内容获取类别

var testCategories = IEnumerable<TestCategoryAttribute>)_t.GetCustomAttributes(typeof(TestCategoryAttribute), true));

如何根据某些条件过滤它们? Linq Any能做到这一点吗?

    if testCategories.Any(c => c == "xyz" || c == "abc") )
    {
        // then add to the treeview node, etc...