使用stacktrace / stackframe反射以获取方法名称和参数

时间:2012-08-28 12:07:24

标签: c# debugging reflection helpermethods

在写我遇到的问题主题时 其他一些最相关的帖子......导致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)方法的名称,我只是添加了调用的时间。

我想在这篇文章中提到的两件事情,关于我对该助手metod的实现: &#34; FunctionName&#34;我从sf.GetMethod那里得到的很好,它抛出了我喜欢这个想法的给定方法的参数类型,只是它包含了parameter.type&#39; s父亲+祖父+曾祖父,但我只想底部类型:

System.Windows.Forms.View

这是最短的之一(:我试图通过玩.Replace()来自己去查看 那么有没有一种方法可以将它剥离或实际上是同一家族中的另一种方法,就像我上面提到的那样提取它,或者我可以使用包含每种可能最常用类型的列表并使用stringReplace做一个foreach?

更重要的是,我如何获得Method(parameterName)?

提前多多感谢!!

可以有人展示一个易于理解,简单的语法示例 获取参数名称?

1 个答案:

答案 0 :(得分: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中生成的常量) - 无需提供它,也不需要走路堆栈来搞清楚。但是,你不能得到这样的参数。