编程语言
首页 > 编程语言> > c# – 自定义属性在编译时执行

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