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

Read the value of an attribute from a method with parameters

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

这个问题 (Read the value of an attribute of a method)

回答了我最初提出的如何从方法中读取属性值的问题

这是一直有效的代码

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("---------------------");
}

这就是我设置要发送的变量的方式(是的,我可以制作一行,但我在一个地方定义它并在许多地方使用它,所以这就是它需要的方式)

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

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

Object reference not set to an instance of an object.

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

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

class AClassInTheProject
{
    [Step("Perform the Step For AMethodNameOne"]
    AMethodNameOne() // This one works
    {
        // Code
    }

    [Step("Perform the Step For AMethodNameTwo"]
    AMethodNameTwo(string parameterA) // This one doesn't work
    {
        // Code
    }
}

背景: 这是一个 Gauge UIAutomation 项目。我需要 运行 在逻辑条件下 UI 自动化中的一些步骤(如果执行步骤 ...),Gauge 不提供支持。执行的所有步骤都需要输出到最终报告(GaugeMes​​sages.....)。这是一个 C# 项目。我的需求在 Gauge 社区的人们中并不常见,因此人们认为它的优先级不够高,无法在源代码中包含修复(这就是我采用此解决方法的原因)。希望足够详细。

归根结底,这是一个 NullReferenceException 问题。

GetRuntimeMethod 的调用是说 "give me a method by this name with no parameters"。它返回 null 因为你想要的方法有参数。它在您删除参数时起作用,因为它符合 "no parameters" 条件。

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

如果您想要任何数量和类型的参数,请使用不带 Type[]GetMethod 重载(假设只有一个方法具有该名称,否则您会得到一个不同的例外)或使用 GetMethods 并从它 returns.

的数组中找到你想要的方法