编程语言
首页 > 编程语言> > 创建C#属性以禁止方法执行

创建C#属性以禁止方法执行

作者:互联网

我希望创建一个自定义属性来抑制在C#中执行方法,即使它被调用.
例如,在下面的代码块中,如果方法具有“跳过”属性,即使从Main调用它也不应该执行.

public class MyClass {

  public static void main()
  {
    aMethod();  
  }

  [Skip]
  public void aMethod() {
    ..
  }

}

如何使用C#中的反射来实现这一目标?

在下面的代码片段中,我设法提取了带有Skip属性的方法,我无法弄清楚如何阻止它们执行!

MethodInfo[] methodInfos = typeof (MyClass).GetMethods();

foreach (var methodInfo in methodInfos)
{
  if (methodInfo.HasAttribute(typeof(SkipAttribute)))
  {
    // What goes here ??
  }
}

我们非常欢迎任何有正确方向的帮助或建议:)

解决方法:

目前尚不清楚你在追求什么.

首先,@ Ignore告诉JUnit测试运行器忽略测试.你没有在你的问题中提到测试,但我们应该清楚这是@Ignore的用途. .NET中的测试运行器具有类似的属性(例如,在xUnit中,属性为[Ignore]).

因此,如果您正在使用测试运行器,请找到该测试运行器的相应属性.如果您没有使用测试运行器,那么在给出@Ignore与测试运行密切相关之后,您究竟是什么?

你在写自己的测试跑步者吗?为什么?有plenty plenty0免费测试跑步者可用.使用它们!

I want the attribute to suppress the execution even if the method is called.

好吧,如果我看过一个,那就是代码味道.

你有几个选择.

将代码插入到您应用的每个方法[忽略]:

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

[Ignore]
public static void M() {
    var ignoreAttributes =
        MethodBase.GetCurrentMethod().GetCustomAttributes(typeof(Ignore), true);
    if (ignoreAttributes.Any()) {
        return;
    }
    // method execution proceeds
    // do something
}

或者,您可以使用interception technique.

或者,您可以使用post-compilation框架.

所有这些都有非常严重的问题.他们有问题,因为你正在做的是代码味道.

标签:c,reflection,custom-attributes,methodinfo
来源: https://codeday.me/bug/20190520/1142401.html