c# - 有没有办法确定哪个类在 .NET 中调用了静态方法

标签 c# asp.net .net

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

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

编辑:参见下面的示例代码

我正在尝试修改异常的处理方式。目前,如果我们正在处理 1000 个支票,并且循环内部在第 500 个支票处出现异常,则不会处理第 500 - 1000 个支票。

我们的网站上有多个调用此中心方法的屏幕。其中一个称为 Check Creation Wizard,另一个称为 ACH Creation Wizard,等等。对于 ACH Creation Wizard,我们希望通过简单地跳过失败的检查来处理异常,然后继续进行其余的检查。但是,对于所有其他向导,如果一个检查失败,我们希望继续使剩余的一批检​​查失败。

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

最佳答案

这一切都是从远处闻起来的。您可以通过多种方式实现这一点,但检测调用类是错误的方式。

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

如果您坚持检测来电者,可以通过多种方式完成:

  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
    }
    
  2. 如果您使用 .NET 4.5,您可以获取来电者信息。不是具体的类,但是你可以在编译时得到调用者的名字和源文件。添加一个默认值用[CallerMemberName][CallerFilePath]修饰的参数,例如:

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

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

更新


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

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

然后在你想继续时将 false 传递给它

关于c# - 有没有办法确定哪个类在 .NET 中调用了静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37752827/

相关文章:

jquery - 使用 Jquery 从 ajax 调用返回大字符串到 ASP.NET 的 Web 方法

javascript - 强制在 Javascript 中为 UpdatePanel 回发?

.net - CommonDialog 组件应该如何处理?

c# - 使用带有 <%@ Register %> 的空 TagPrefix

c# - 内存流为空

c# - 如何在 C#.net 中使用网页调度程序

c# - 无法查看我使用 json 返回的查询结果

C# 将对象转换为十进制

c# - 动态添加组合框中的项目和用户添加的项目应该是永久的而不使用数据库,可能吗?

c# - 如何删除变量内的双引号?