首页 / C# / c# – 自定义属性在编译时执行
c# – 自定义属性在编译时执行
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 自定义属性在编译时执行,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2226字,纯文字阅读大概需要4分钟。
内容图文
我正在尝试创建一个自定义属性,它将以一种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# – 自定义属性在编译时执行全部内容,希望文章能够帮你解决c# – 自定义属性在编译时执行所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。