Linq扫描程序集以查找具有特定属性和属性属性的方法

时间:2018-03-08 15:02:18

标签: c# reflection attributes

我试图编写一个linq语句,它将扫描整个执行程序集,查找具有特定属性和特定属性属性值的方法。

这是我的属性......

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)]
public class ScenarioSetup : Attribute
{
    public string ScenarioTitle { get; set; }

    public bool ActiveForBuild { get; set; }
}

这是一个使用它的方法的例子......

[ScenarioSetup(ScenarioTitle = "R/S/T [Assessor Management] ASM.08 - Activate Assessor", ActiveForBuild = true)]
public void CreateInactiveAssessor()
{
    var assessor = ApiHelper.PostRequest(AssessorFactory.CreateAssessorApi("Woodwork"), Client, false);

    AddStateItem(assessor, StateItemTag.AssessorEntity);
}

因此,使用上面的示例,我想使用反射来查找具有[ScenarioSetup]属性的方法,然后检查属性ScenarioTitle是否等于某个值(在这种情况下' R / S / T [评估员管理] ASM.08 - 激活评估员')

这就是我到目前为止......

var methodz = Assembly.GetExecutingAssembly().GetTypes()
            .SelectMany(t => t.GetMethods())
            .Where(m => m.GetCustomAttributes(typeof(ScenarioSetup), false).Length > 0);

然后我迷路了,试图进行ScenarioTitle检查。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试:

var methodz = Assembly.GetExecutingAssembly().GetTypes()
                      .SelectMany(t => t.GetMethods())
                      .Where(m => m.GetCustomAttributes(typeof(ScenarioSetupAttribute), false)
                      .Cast<ScenarioSetupAttribute>().Where(a=>a.ScenarioTitle=="R/S/T [Assessor Management] ASM.08 - Activate Assessor").Length > 0);

答案 1 :(得分:1)

另一种方式是:

`

var methods = Assembly.GetExecutingAssembly()
.GetTypes()
.SelectMany(t => t.GetMethods())
.Where(m => m.GetCustomAttributes<ScenarioSetupAttribute>().Any())
.Where(x=>x.GetCustomAttribute<ScenarioSetupAttribute>().ScenarioTitle=="R/S/T [Assessor Management] ASM.08 - Activate Assessor");`