我们有一个中央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)
这一切都远远闻到了.你可以通过多种方式实现这一点,但检测调用类是错误的.
为这个特定的其他类创建一个不同的静态方法,或者有一个额外的参数.
如果您坚持要检测呼叫者,可以通过以下几种方式完成:
使用堆栈跟踪:
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)如果您使用.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)只需使用带有默认值的附加参数(或任何类型的不同签名)
请注意,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当你想要继续前进的时候再过去
| 归档时间: |
|
| 查看次数: |
4798 次 |
| 最近记录: |