自定义属性在编译时执行

2024-01-08

我正在尝试创建一个自定义属性,该属性将以某种 AOP 方式工作(不幸的是,我无法访问 postsharp,而且我对 Unity 也不是很熟悉)。它有 AttributeUsage.Method ,并在其构造函数中配置测试环境的某些部分(从 app.config 中提取一些信息并调用一些配置环境的 exe)。

它有效,除了现在,当我构建解决方案时,该属性被执行 - 这是不可取的。

有没有办法创建不在编译时执行的自定义属性?

编辑> 我想一个示例用法可能会有所帮助:

public void Scenario1Tests
{
    [Test]
    [Environment(Environments.A)]
    public void Scenario1TestA()
    {
        Assert.Something();
    }

    [Test]
    [Environment(Environments.Any)]
    public void Scenario1TestB()
    {
        Assert.SomethingElse();
    }
}

// Most tests will be written environment independent, some must not
public enum Environments
{
    A, 
    B, 
    Any
};

[AtrributeUsage(AttributeTargets.Method)]
public void Environment : Attribute
{
    public Environment(Environments env)
    {
        // lots of test can have this attribute, requirement is 
        // that it is only configured once as it is a lengthy configuration
        if (this.EnvironmentIsAlreadyConfigured())
            return;

        this.GetSettingsFromAppConfig();
        Process.Start(/* ... */); // can take 20 mins+
    }        

    public Environment()
        : this(Environments.Any)
    {
    }
}

通常的方法是严格使用属性作为标记。您在构造函数中对其进行配置,但不执行任何操作。然后,在运行时,您通过反射检查方法,从属性中提取配置信息,并根据该信息采取适当的操作。

例如,如果您想要一个在执行方法之前检查参数是否为 null 的属性,您可以像这样创建它:

[AttributeUsage(AttributeTargets.Method)]
public class CheckArgumentsNullAttribute : Attribute
{
    public CheckArgumentsNullAttribute() { }
}

然后,将您的方法标记为这样:

[CheckArgumentsNull]
public Foo(object o) { Console.WriteLine(o.ToString()); }

然后,在您的代码中获取Foo通过反射的方法,并检查它的属性:

MethodInfo m = typeof(FooClass).GetMethod("Foo");
if (m.GetCustomAttributes(typeof(CheckArgumentsNullAttribute), false).Length > 0)
{
    // Check parameters for null here
}

Update:由于您在 MSTest 运行该方法的情况下需要这个,因此您应该看一下本文 http://callumhibbert.blogspot.com/2008/01/extending-mstest.html,其中讨论了如何挂钩测试过程。基本上,你需要从ContextBoundObject,并拦截方法调用以执行您想要的属性处理。

Update 2:考虑到该属性的作用,我可能只会将环境设置设置为一个方法,并从适当的测试开始时调用它。我不认为拥有一个属性会给你带来那么多好处。或者,您可以按环境划分灯具,并在灯具设置/拆卸中执行环境设置/拆卸。无论哪种方式都可能比尝试让 AOP 在这里工作要容易得多,尤其考虑到该属性的“一次执行”性质。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义属性在编译时执行 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • Python 如何以及何时确定变量的数据类型? [复制]

    这个问题在这里已经有答案了 我试图弄清楚 Python 3 使用 CPython 作为解释器 到底是如何执行其程序的 我发现步骤是 通过 CPython 编译器将 Python 源代码 py 文件 编译为 Python 字节码 pyc 文件
  • 返回父元素 - Cypress 中的 CSS 选择器

    有人可以在以下情况下提供帮助吗 我必须办理登机手续if语句元素是否存在 由于没有可能使用Xpath in find命令 使用 Xpath 运行时引发语法错误 我的代码看起来 cy xpath list eq index then el1 g
  • Bluebird 的 Promise.settle 无法解析正确的值

    我有以下代码 return Promise settle matches imgur uploadUrl map function inspection if inspection isFulfilled return inspection
  • 如何使用 JavaScript 访问 SVG 元素?

    我正在摆弄 SVG 希望能够在 Illustrator 中创建 SVG 文件并使用 JavaScript 访问元素 这是 Illustrator 推出的 SVG 文件 它似乎还向我删除的文件的开头添加了一堆垃圾
  • 自动完成在自动完成窗口中显示相关数据

    I have 3 input fields 1 for data type and other 2 are its relevant when i press button in data type field i want to disp
  • 嵌套静态类中不允许扩展方法?

    为什么是这样 我会找到它really很高兴能够将一些扩展方法锁定为仅在我的一个类中使用 我真的不想让某些扩展方法随处可用 而且它们看起来比常规静态方法好得多 P 为了澄清 我想要这些扩展方法的原因是因为我正在扩展一个 Form 它上面有一个
  • jquery mobilescrollview-如何显示隐藏内容并阻止scrollview弹回到初始位置

    我正在使用滚动视图插件开发 JQM 项目 我已完成所有设置 并且滚动视图正在工作 但是 要滚动的 隐藏 内容不会完全加载 并且滚动视图始终会弹回到其初始位置 这是示例的链接 example http www franckreich de 3
  • 在 Html

    中设置行高,使 html 在

    具有不同字体大小时看起来像 Of​​fice Word

    如何在一个html标签中设置行高 p 当这个 p p 有两种不同的字体大小 如果我设置 p p style line height 50 p 那么整个 p 只有一种行高 但我希望它的行为就像 Microsoft Office Word 和
  • WPF 按钮图像仅显示在最后一个控件中

    我对 WPF 相当陌生 可能缺少一些简单的东西 如果我有 3 个控件 则只有最后一个控件会显示我指定的 OriginalImage 非常感激任何的帮助 谢谢 瑞安 主窗口
  • 来自 HttpClient 的重复请求

    我在 android 上使用 HttpClient 4 0 1 我发出一个 POST 请求 其标头集是当前的毫秒数 我看到该请求在彼此间隔几毫秒 5 10 的时间内两次命中服务器 但是我为两个请求设置的标头是相同的 这种情况偶尔会发生 我认
  • SQL 结果作为 PHP 数组

    如何获取包含多行到数组中的 SQL 结果 SQL 表示例 ID Cat LineID Qty DealID Cost 1 Phone 1 2 8941 25 00 2 Phone 2 43 8941 85 00 3 Net 1 2 8941
  • 校对强度和本地语言关系

    我已从 Collat or 的 Javadoc 中阅读了以下内容 对语言功能的优势的准确分配取决于区域设置 例如 在捷克语中 e 和 f 被认为是主要差异 而 e 和 是次要差异 e 和 E 是三级差异 e 和 e 是相同的 这是否意味着我
  • 在 Javascript 中编写部分复制对象的优雅方法?

    我有一个代表表单字段的 javascript 对象 其中大约 70 的字段必须复制到某些对象中才能发送到服务器 其他字段用于 UI 使用 目前 我通过手动为每个字段创建分配来克隆对象 这会导致结构不太好 如下所示 请注意 我将使要复制的部分
  • Symfony Cache 学说/orm/Proxies 无法在第 209 行打开流 /Proxy/AbstractProxyFactory.php

    我正在尝试将 symfony 移动到共享主机 我将 symfony 结构移至 我的 Web 文件夹是 public html 警告 require home user app cache prod doctrine orm Proxies
  • 使用 pytest --collect-only 仅返回单个测试名称

    我正在尝试弄清楚如何使用 pytest 从测试文件中获取测试名称列表 到目前为止我已经做到了 pytest collect only my test file py test session starts platform darwin P
  • 将两字节位掩码转换为 EnumSet

    我正在读取一个二进制文件 该文件的值存储在位掩码中 均为 1 字节位掩码和 2 字节位掩码 掩码中的每一位都充当一个开关 指示事件发生的位置 1 字节掩码示例 00000101 表示事件一和事件 3已经发生了 的例子Enum public
  • 确定该函数内的函数名称

    如何获取该非匿名函数中的函数名称 下面我假设有一个函数或进程可以执行此操作 称为magical r function 以及预期的产出是什么 my fun lt function magical r function my fun 1 my
  • JPA/EclipseLink 未返回结果

    我是 Java 和 JPA 新手 我正在尝试连接到数据库并从表中返回一些结果 但是当我运行查询时 即使该表有超过 100 000 行 我也会得到一个空列表 这是我的 persistence xml
  • 什么是 Java 混合 - Applet + 应用程序?

    我怎样才能写一个呢 从评论到我的reply https stackoverflow com a 12447764 166390 接下来是 我们过去拥有的东西 小程序和应用程序 现在已经不可用了 并反驳 垃圾 它 Applet 和应用程序 被
  • 自定义属性在编译时执行

    我正在尝试创建一个自定义属性 该属性将以某种 AOP 方式工作 不幸的是 我无法访问 postsharp 而且我对 Unity 也不是很熟悉 它有 AttributeUsage Method 并在其构造函数中配置测试环境的某些部分 从 ap