首页 > 解决方案 > C#自定义属性可以获取它们所附加的方法的参数吗?

问题描述

我有一个自定义属性,希望能够从属性代码内部检查它附加到的项目的签名。

这从属性外部很容易,但它特别需要在属性内部。我试过遍历 StackTrace 但这没有得到我要附加的方法,而且 CallerMemberName 也没有得到我需要的东西。


public class MyAttribute : Attribute
{
  public void ReadDetails()
  {
    MethodInfo attachee = ???; // TODO

    Console.WriteLine(attachee.MethodName); // expect "Baa"
    Console.WriteLine(attachee.GetParameters()[0].ParameterType.Name); // expect "int"
    Console.WriteLine(attachee.GetParameters()[0].Name); // expect "a"
  }
}

public class foo
{
  [MyAttribute]
  public void Baa(int a, string b) {}
}

就上下文而言,这是为了支持一些自动化测试 - 我有一个描述用户界面的数据电子表格,并且参数少于电子表格列的测试方法。我有一个自定义属性,它继承了 NUnit TestCaseSourceAttribute 并读取电子表格,但需要将列过滤到测试用例需要的内容。例如,我将进行如下测试:

[SpreadsheetDrivenTests("ui.xlsx")]
public void TestButtonText(string buttonId, string expectedText) {}

[SpreadsheetDrivenTests("ui.xlsx")]
public void TestButtonVisibility(string buttonId, bool expectedVisible) {}

请注意,这样做的部分动机是避免为每个方法指定两次参数。以下解决方案将是次优的(但很容易完成)

[SpreadsheetDrivenTests("ui.xlsx", "buttonId", "expectedText")]
public void TestButtonText(string buttonId, string expectedText) {}

[SpreadsheetDrivenTests("ui.xlsx", typeof(this), nameof(ParameterGenerator)]
public void TestButtonVisibility(string buttonId, bool expectedVisible) {}

public static string[] ParameterGenerator()
{
  return { "buttonId", "expectedVisible" };
}

标签: c#reflectionattributes

解决方案


推荐阅读