3

質問の件名を書いているときに、他のほとんど関連する投稿に出くわしました... MSDN http://msdn.microsoft.com/en-us/library/system.reflection.parameterinfo.aspxにつながります

しかし、必要なコードを抽出することはできませんでした

次のように、st と sf に基づくヘルパー メソッドでメソッド名を取得する方法を学びました。

    public void setLogView(View ViewMode)
    {
        AAdToAppLog();

        Lview_AH_AutomationLog.Sorting = SortOrder.Ascending;
        ColumnHeader ColHeadRowNo = new ColumnHeader();
        ColumnHeader ColHeadFunction = new ColumnHeader();
        ColumnHeader ColHeadContent = new ColumnHeader();
        ColumnHeader ColHeadTime = new ColumnHeader();

        Lview_AH_AutomationLog.View = ViewMode;
        Lview_AH_AutomationLog.Columns.Add(ColHeadRowNo);
        Lview_AH_AutomationLog.Columns.Add(ColHeadFunction);
        Lview_AH_AutomationLog.Columns.Add(ColHeadContent);
        Lview_AH_AutomationLog.Columns.Add(ColHeadTime);
        ColHeadRowNo.Text = "#";
        ColHeadFunction.Text = "Function Name";
        ColHeadContent.Text = "Content";
        ColHeadTime.Text = "Time";
        ColHeadRowNo.Width = 45;
        ColHeadFunction.Width = 150;
        ColHeadContent.Width = 150;
        ColHeadTime.Width = 100;
    }



    public void AAdToAppLog(string FunctionOutPut = "N/A")
    {
        string t = DateTime.Now.ToString("mm:ss.ff");
        string h = DateTime.Now.ToString("HH");
        ListViewItem FirstCell= new ListViewItem();
        FirstCell.Text =h+":" +pre0Tosingle_9(LogCounter.ToString());//Another helper puts 0 infront <=9 digits
        Lview_AH_AutomationLog.Items.Insert(0, FirstCell);
        StackTrace st = new StackTrace(); 
        StackFrame sf = st.GetFrame(1);
        string FunctionName = sf.GetMethod().ToString().Replace("Void", "").Replace("System.Windows.Forms.", ""); 
        FirstCell.SubItems.Add(FunctionName);
        FirstCell.SubItems.Add(FunctionOutPut);
        FirstCell.SubItems.Add(t);

        LogCounter++;

    }

だから私が望むすべての方法で私はただ入れます

AddToAppLog()

そのメソッドには AddToAppLog() への呼び出しが含まれており、(ListView 経由で) メソッドの名前をレポートし、呼び出しの時間を追加しました。

そのヘルパー メソッドの実装について、この投稿で対処したいことが 2 つあります: sf.GetMethod から受信した "FunctionName" は、特定のメソッドのパラメーターの型をスローするという点で優れています。 parameter.typeのFather + Grandfather + Great-Grandfatherが含まれていますが、一番下の Type のみが必要です:

System.Windows.Forms.View

これは最も短いものの1つです(:そして、.Replace()で遊んで自分でViewにアクセスしようとしたので、それを取り除く別の方法または実際に同じファミリーの別の方法で、上記の方法で抽出するか、または最もよく使用される可能性のあるすべての型を含むリストを使用して、stringReplace で foreach を実行できますか?

さらに重要なことに、メソッド(パラメータ名)も取得するにはどうすればよいですか?

よろしくお願いします!

パラメータ名を取得する簡単な構文のわかりやすい例を誰かが表示できますか?

4

1 に答える 1

3

これの核心は、sf.GetMethod();を含む行です。代わりにそれを保存する場合:

var method = sf.GetMethod();
string name = method.Name;
var parameters = method.GetParameters();

.Name完全な署名にアクセスできます。完全に宣言された型名などではなく、単純な名前であることに注意してください。もちろんmethod.DeclaringType.Name、より多くのコンテキストが必要な場合はアクセスできます。パラメータの宣言しか取得できないことに注意してください。通常のメカニズムを介してを取得することはできません。

でも!!!また、これらすべてにリフレクションとスタック ウォーキングに関連するパフォーマンス コストがあることも確認します。C# 5 コンパイラをお持ちの場合は、次の方法をお勧めします。

public void AAdToAppLog([CallerMemberName] string callerName = "")
{ ... }

これは、コンパイラが自発的に(IL で生成された定数として)呼び出し元の名前を提供することを意味します。それを提供する必要も、スタックを調べて把握する必要もありません。ただし、このようなパラメーターを取得することはできません。

于 2012-08-28T12:16:39.123 に答える