从带有参数的方法中读取属性的值

时间:2018-12-07 21:52:42

标签: c# reflection attributes getgauge

我一直在寻找一种获取属性值并将其发送到我必须制作的报告中的方法。简而言之,当一个方法没有参数但任何带有参数的方法都抛出错误时,我找到了答案。

我最初的问题是如何从方法中读取属性值,这个问题(Read the value of an attribute of a method

这是一直在工作的代码

SELECT COUNT(*) AS prod_count, StartDate, ENDdate
FROM XXX
GROUP BY StartDate, ENDdate;

这就是我设置要发送的变量的方式(是的,我可以写那一行,但是我在一处定义它,然后在很多地方使用它,这就是它所需要的方式)

SELECT COUNT(*) AS prod_count, StartDate, ENDdate
(
    SELECT StartDate, ENDdate, (StartDate - ENDdate) AS TimePeriod 
    FROM XXX
) AS X2
GROUP BY TimePeriod;

当我尝试提供其中具有参数的方法(methodName)时,以Attribute [] attribute ....开头的代码行将引发错误。当我输入“ methodName”时,它总是那样(没有括号,因为它不会接受那些)。产生的错误说:

public static void WriteStepNamesOfMethodToReport(Type classType, string methodName)
{
    MethodInfo methodInfo = classType.GetRuntimeMethod(methodName, new Type[] { });
    Attribute[] attributeList = (System.Attribute[])methodInfo.GetCustomAttributes(typeof(Step), true);

    GaugeMessages.WriteMessage("---------------------");
    foreach (Attribute attr in attributeList)
    {
        Step a = (Step)attr;
        GaugeMessages.WriteMessage("Executed Step - {0}", a.Names.ElementAt(0));
    }
    GaugeMessages.WriteMessage("---------------------");
}

我尝试从抛出错误的特定方法中临时删除参数,它看到了我正在寻找的Step属性,并将其输出到报告中。

这是我正在使用的类的基本布局(与所有有效的非参数方法相同的设置)。

Type classType = typeof(AClassInTheProject);
GenericHelpers.WriteStepNamesOfMethodToReport(classType, nameof(AMethodNameFrom_AClassInTheProject));

背景: 这是针对Gauge UIAutomation项目的。我需要在Gauge不提供支持的逻辑条件下(如果执行A步骤...)在UI Automation中运行一些步骤。所有执行的步骤都需要输出到最终报告(GaugeMes​​sages .....)。这是一个C#项目。我的需求在Gauge社区中并不常见,因此没有被优先考虑在源代码中包含修复程序(这就是为什么我要这样做的原因)。希望这已经足够详细了。

1 个答案:

答案 0 :(得分:0)

从根本上讲,这是一个NullReferenceException问题。

GetRuntimeMethod的呼叫是说“给我一个以此名称命名的方法,不带参数”。返回null是因为您要的方法具有参数。当您删除参数时,它可以工作,因为它符合“无参数”条件。

如果需要特定的参数类型,请指定它们,例如new Type[] { typeof(string) }

如果要使用任意数量和类型的参数,请使用不占用GetMethod的{​​{1}}重载(假设该名称只有一个方法,否则将得到另一个异常)或使用Type[]并从它返回的数组中找到所需的方法。