c# – 自定义属性在编译时执行
作者:互联网
我正在尝试创建一个自定义属性,它将以一种AOP方式工作(我无法访问postharp,不幸的是,我对Unity不是很熟悉).它有AttributeUsage.Method,并在其构造函数中配置测试环境的某些部分(从app.config中提取一些信息并调用一些配置环境的exes).
它的工作原理,除了现在,当我构建解决方案时,属性被执行 – 这是不可取的.
有没有办法创建一个不在编译时执行的自定义属性?
编辑>我想一个示例用法可能会有所帮助:
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
}
更新:由于在MSTest运行方法的场景中需要这个,所以你应该看看this article,它讨论了如何挂钩测试过程.基本上,您需要从ContextBoundObject扩展,并拦截方法调用以执行所需的属性处理.
更新2:鉴于属性的作用,我可能只是将环境设置为一个方法,并从适当的测试开始调用它.我不认为你通过拥有一个属性获得了那么多.或者,您可以按环境划分灯具,并在夹具设置/拆卸中执行环境设置/拆卸.无论哪种方式都可能比尝试使AOP在这里工作容易得多,特别是考虑到属性的“一次性”性质.
标签:c,aop,custom-attributes 来源: https://codeday.me/bug/20190530/1186093.html