有没有办法确定哪个类在.NET中称为静态方法

Pav*_*vel 2 .net c# asp.net

我们有一个中央STATIC方法,可以从ASP.NET应用程序的许多不同位置调用.

我需要向静态方法添加一些条件逻辑,只有在从特定类调用方法时才需要运行.一种方法是在静态方法的签名中添加一个额外的参数 - 某种枚举可以表示哪个类称为静态方法,但我希望.NET提供更优雅的方法.

编辑:请参阅下面的示例代码

我试图修改异常的处理方式.目前,如果我们正在处理1000次检查,并且在检查500处的循环内存在异常,则不会处理检查500-1000.

我们的网站上有几个屏幕,称之为中央方法.其中一个叫做Check Creation Wizard,另一个叫做ACH Creation Wizard等.对于ACH创建向导,我们想通过简单地跳过失败的检查来处理异常,然后继续进行其余的检查.但是,对于所有其他向导,如果一个失败,我们希望继续对剩余的一批检​​查失败.

public static string GenerateChecks(List<CheckJob> checkJobs)
{
    foreach (CheckJob check in checkJobs)
    {
        try
        {
            bool didGenerate = DoGenerate(check);
            if(didGenerate)
            {
                Account acct = LoadAccount(check.GetParent());
                ModifyAccount(acct);
                SaveAcct(acct);
            }
        }           
        catch (Exception ex)
        {
            if (Transaction.IsInTransaction)
            {
                Transaction.Rollback();
            }

            throw;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jcl*_*Jcl 5

这一切都远远闻到了.你可以通过多种方式实现这一点,但检测调用类是错误的.

为这个特定的其他类创建一个不同的静态方法,或者有一个额外的参数.

如果您坚持要检测呼叫者,可以通过以下几种方式完成:

  1. 使用堆栈跟踪:

    var stackFrame = new StackFrame(1);
    var callerMethod = stackFrame.GetMethod();
    var callingClass = callerMethod.DeclaringType; // <-- this should be your calling class
    if(callingClass == typeof(myClass))
    {
       // do whatever
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您使用.NET 4.5,则可以获得呼叫者信息.不是特定的类,但您可以在编译时获取调用者名称和源文件.添加一个带有[CallerMemberName]或用装饰的默认值的参数[CallerFilePath],例如:

    static MyMethod([CallerFilePath]string callerFile = "")
    {
      if(callerFile != "")
      {
         var callerFilename = Path.GetFileName(callerFile);
         if(callerFilename == "myClass.cs")
         {
            // do whatever
         }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 只需使用带有默认值的附加参数(或任何类型的不同签名)

请注意,1非常慢,2只是非常糟糕...所以为了更好:如果您需要不同的过程,请使用不同的方法

更新


看完你的代码之后,你更清楚的是你想要两个不同的方法或一个参数...例如:

public static string GenerateChecks(List<CheckJob> checkJobs, bool throwOnError = true)
{
    //...
    catch (Exception ex)
    {
      if(throwOnError)
      {
        if (Transaction.IsInTransaction)
        {
           Transaction.Rollback();
        }
        throw;
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

false当你想要继续前进的时候再过去