5

我希望创建一个自定义属性来抑制方法在 C# 中执行,即使它被调用。例如,在下面的代码块中,如果方法具有“Skip”属性,则即使从 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 ??
  }
}

任何在正确方向上的帮助或建议都是最受欢迎的:)

4

2 回答 2

5

目前还不清楚你在追求什么。

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

因此,如果您使用的是测试运行器,请找到该测试运行器的相应属性。如果您没有使用测试运行器,那么您究竟是什么,因为它@Ignore与测试运行密切相关?

您是否正在编写自己的测试运行程序?为什么?有很多非常 好的免费测试运行器可用。使用它们!

即使调用了该方法,我也希望该属性抑制执行。

好吧,如果我见过的话,那是一种代码味道。

你有几个选择。

将代码插入您应用的每个方法中[Ignore]

[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
}

或者,您可以使用拦截技术

或者,您可以使用后编译框架。

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

于 2013-05-29T18:50:47.990 回答
0

不太确定你到底想达到什么目标。
如果您的意图是创建类似于 JUnit/NUnit 的东西,那么这里的代码演示了这些工具的工作方式:

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

foreach (var methodInfo in methodInfos)
{
  bool ignore = methodInfo.HasAttribute(typeof(SkipAttribute));
  if (ignore)
  {
    // do nothing
  }
  else
  {
     // launch method
     methodInfo.Invoke(/*params here*/);
  }
}

但是,如果您想让方法不被 CLR 调用,即使有显式调用 - 那么您需要使用Preprocessor Directives

于 2013-05-29T19:19:52.827 回答