1

関数への特定の呼び出しを自動的に識別するにはどうすればよいですか?

この例は簡略化されたものです。例から見えるよりも、これが必要な理由が (いくらか) あります。

次のようなコードがある場合:

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

「locationA」と「locationB」の代わりに使用する識別子を自動的に生成して、どのコード行が呼び出しを行っているかを知る方法を知りたいです。

各場所の識別子をハードコーディングするオプションはありません。たとえば、インクリメントされる番号にすることはできません。毎回同じ関数呼び出しに対して生成された同じ識別子である必要があります。

私の考えでは、リフレクションを使用できる可能性があります (ただし、IL 行番号のようなものが利用できるかどうかはわかりません)。上記の条件。

ご協力いただきありがとうございます。


より詳しい情報:

質問者は私の同僚であり、提供された回答は問題を解決しているようですが、より良い選択肢がある場合は、追加情報を提供します. 特定の場所を特定する理由は、サーバー側のコード (c#) とクライアント側のコード (JavaScript) の間でプロンプトを出す (対話するためにユーザーにメッセージを送り返す) ためです。アプリケーションの状態に基づいて一連のプロンプトがある場合、たとえば、データベースで何かがロックされている場合に最初のプロンプトが発生し、ユーザーに何をすべきか (キャンセルなど) を尋ね、その後に 2 番目のプロンプトが発生します。2 つ目に移動する前に最初のものを処理する必要があるため、サーバー コードを終了して最初のプロンプトを返します。

プロンプトをコーディングするとき、動的に ID を割り当てます (この場合、ハードコーディング (つまり、1、2、3、または GUID など) を避けるために、現在 ID を自動インクリメントしています)。この動的 ID は、呼び出すたびにリセットされます。問題のメソッド (ID が一致するように。最初のプロンプトの ID は「1」、2 番目のプロンプトは「2」です)。

ユーザーが回答して再試行すると、回答をリストに割り当てて、リスト内のプロンプト回答とコード内にある特定のプロンプトを照合する操作を呼び出すという考え方です。次に、次のプロンプトに進み、同じプロセスを繰り返します。

ただし、2 つのプロンプトでメソッドに戻るまでにロックが存在しない場合 (最初のプロンプト)、コードのそのセクションには分岐しません (プロンプトの前にロックのチェックがあります)。したがって、2 番目のプロンプトにジャンプしますが、2 番目のプロンプトは 2 ではなく 1 の ID を自動生成し、回答がない場合は既に回答があると見なします。

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
String callerName = (new StackTrace()).GetFrame(0).GetMethod().Name;

Int lineNo = (new StackTrace()).GetFrame(0).GetFileLineNumber();
于 2013-06-06T17:10:13.920 に答える
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 に答える