我们有一个中央 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;
}
}
}
最佳答案
这一切都是从远处闻起来的。您可以通过多种方式实现这一点,但检测调用类是错误的方式。
要么为这个特定的其他类创建一个不同的静态方法,要么有一个额外的参数。
如果您坚持检测来电者,可以通过多种方式完成:
使用堆栈跟踪:
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 }
如果您使用 .NET 4.5,您可以获取来电者信息。不是具体的类,但是你可以在编译时得到调用者的名字和源文件。添加一个默认值用
[CallerMemberName]
或[CallerFilePath]
修饰的参数,例如:static MyMethod([CallerFilePath]string callerFile = "") { if(callerFile != "") { var callerFilename = Path.GetFileName(callerFile); if(callerFilename == "myClass.cs") { // do whatever } } }
只需使用具有默认值(或任何类型的不同签名)的附加参数
请注意,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/