1

如何自动识别对函数的特定调用?

这个例子被简化了,我有(有点)比这个例子更好的理由想要这个。

如果我的代码如下所示:

...
myObj.method1("locationA", otherParams);
...
myObj.method1("locationB", unrelatedParams);
...

我想知道如何自动生成用于代替“locationA”和“locationB”的标识符,以便我可以知道哪一行代码正在执行调用。

硬编码每个位置的标识符不是一种选择,例如,它不能是递增的数字。它必须是每次为相同的函数调用生成的相同标识符。

我的想法是我们也许可以使用反射(尽管我不知道是否可以使用 IL 行号之类的东西),但我愿意接受有关如何执行此操作的任何其他想法,只要它符合以上条件。

谢谢你的帮助。


更多信息:

询问者是我的同事,提供的答案似乎解决了这个问题,但如果有更好的选择,我会提供一些额外的信息。我们想要识别特定位置的原因是我们在服务器端代码 (c#) 和客户端代码 (JavaScript) 之间进行提示(向用户发送消息以与之交互)。如果我们有一系列基于应用程序状态的提示,比如说,如果数据库中的某些内容被锁定并询问用户要做什么(例如取消),则会出现第一个提示,然后会出现第二个提示。我们需要在移动到第二个之前处理第一个,所以我们退出服务器代码并返回第一个提示。

当我们对提示进行编码时,我们会为其动态分配一个 ID(在这种情况下,当前自动递增一个 ID,以避免硬编码(即 1、2、3 或 guid 等)。每次调用时,此动态标识都会重置有问题的方法(以便 ID 保持一致;第一个提示的 id 为“1”,第二个提示的 id 为“2”)。

这个想法是,当用户回答和重试时,我们将答案分配给一个列表并调用操作,然后将列表中的提示答案与位于代码中的特定提示相匹配。然后我们继续下一个提示,然后重复相同的过程。

但是,如果当我们回到带有两个提示的方法时,并且锁不再存在(第一个提示),我们不会分支到代码的那部分(在提示之前检查锁)。因此,我们跳到第二个提示,但是第二个提示会自动生成一个 ID 1,而不是 2,并认为它已经有答案,但实际上没有。

我突出显示了创建 ID 的代码,并查看是否有与提示 ID 匹配的答案(答案列表存储在 中PromptHandler):

在此处输入图像描述

4

3 回答 3

2

使用 .NET 4.5,您可以使用某些编译器“助手”(例如调用行 # 等)来为您的参数赋予属性。

void method1(useful params, 
            [CallerFilePath] string filePath = "", 
            [CallerLineNumber] int lineNumber = 0) 
{ ... }

然后你会调用允许编译器提供默认参数:

myObj.method1(parameters);

在函数内部,那些其他参数将填充有用的信息。

有关详细信息,请参阅[CallerFilePath]属性帮助:http: //msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callerfilepathattribute.aspx

于 2013-06-06T16:51:09.130 回答
1

.NET 4.5 有一些可能适合您需要的跟踪属性。

using System.Runtime.CompilerServices;

void Main()
{
    var myObj = new MyClass();
    myObj.Method1("foo", 1);
}

public class MyClass
{
    public void Method1(object someArgument, object someOtherArgument,
                 [CallerMemberName] string callerMemberName = null,
                 [CallerFilePath] string callerFilePath = null,
                 [CallerLineNumber] int callerLineNumber = 0)
    {
        Console.WriteLine(
             string.Format("Called with {0}, {1} from method {2} in file {3} at line number {4}",
                someArgument, someOtherArgument, 
                callerMemberName, callerFilePath, callerLineNumber));
    }
}

http://intellitect.com/new-attributes-for-tracelogging-information-in-net-4-5/

于 2013-06-06T16:47:12.323 回答
1
String callerName = (new StackTrace()).GetFrame(0).GetMethod().Name;

Int lineNo = (new StackTrace()).GetFrame(0).GetFileLineNumber();
于 2013-06-06T17:10:13.920 回答