c# - 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" };
}
解决方案
推荐阅读
- javascript - 未处理的承诺拒绝 [错误:屏幕“LocationType”的“组件”道具的值无效。它必须是一个有效的 React 组件。]
- sql - 基于 SQL Query 的数据透视表
- macos - Macos VSCode 不运行某些扩展
- python - Python Ta-lib 正确顺序
- terminal - 启动 Jupyter 时如何防止终端窗口的数量增加
- python - Tkinter - 代码结构、构造和组织 - 应用程序附加子帧
- java - 如何按值对字符串和整数的 HashMap 进行排序,如果重复,然后按键对它们进行排序,包括俄语单词
- django - 仅限成员的 Django 权限
- javascript - 让粘性元素与溢出-y 滚动元素一起使用:在桌面上工作而不是在移动设备上工作?
- c - 已声明但未初始化的变量会回忆起尴尬的值