【发布时间】:2011-08-30 18:14:46
【问题描述】:
我正在尝试创建一个可以以某种 AOP 方式工作的自定义属性(不幸的是,我无法访问 postsharp,而且我对 Unity 也不是很熟悉)。它有 AttributeUsage.Method 并在其构造函数中配置测试环境的某些部分(从 app.config 中提取一些信息并调用一些配置环境的 exes)。
它可以工作,只是现在,当我构建解决方案时,会执行该属性 - 这是不受欢迎的。
有没有办法创建在编译时不执行的自定义属性?
edit> 我想一个示例用法可能会有所帮助:
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)
{
}
}
【问题讨论】:
-
您确定属性的构造函数在编译期间运行吗?如果是这样,那么我不知道为什么 Visual Studio 会费心地唠叨我自定义构建步骤中潜在的恶意代码......
-
@Frédéric Hamidi:很确定。我没有任何构建事件,它调用的 exe 是我代码中的那些,如果我在测试中注释掉该属性,它就不会发生。
-
所以这是一个测试程序集?它确实应该在构建期间运行:)
-
我猜当代码在运行的应用程序中加载时,属性的构造函数会被调用,对吧?实际上不是在项目构建的时候?
-
@StriplingWarrior,该属性用于测试项目,计划在构建期间运行。因此,代码确实是在编译后加载到正在运行的应用程序中的。
标签: c# aop custom-attributes