-1

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

这个问题回答了我最初关于如何从方法中读取属性值的问题(读取方法的属性值

这是一直在工作的代码

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));

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

Object reference not set to an instance of an object.

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

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

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 项目。我需要在 Gauge 不提供支持的逻辑条件下(如果执行步骤 ...)在 UI 自动化中运行一些步骤。执行的所有步骤都需要输出到最终报告(GaugeMes​​sages.....)。这是一个 C# 项目。我的需求在 Gauge 社区的人们中并不常见,因此在源代码中包含修复被认为不够优先(这就是我这样做的原因)。希望这足够详细。

4

1 回答 1

0

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

那个调用GetRuntimeMethod是说“给我一个没有参数的这个名字的方法”。它返回null是因为您想要的方法有参数。当您删除参数时它会起作用,因为它匹配“无参数”条件。

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

如果您想要任何数量和类型的参数,请使用GetMethod不带 a 的重载Type[](假设该名称只有一个方法,否则您会得到不同的异常)或使用GetMethods并从数组中找到您想要的方法它返回。

于 2018-12-07T22:20:23.533 回答