【问题标题】:reflection with stacktrace / stackframe to get both methods name and parameters使用 stacktrace / stackframe 进行反射以获取方法名称和参数
【发布时间】:2012-08-28 12:07:23
【问题描述】:

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

我想在这篇文章中解决两件事,关于我对该辅助方法的实现: 我从 sf.GetMethod 收到的“FunctionName”很好,它抛出了给定方法的参数类型,我喜欢这个想法,只是它包含 parameter.type 的父亲 + 祖父 + 曾祖父,但我只想底部类型:

System.Windows.Forms.View

这是最短的之一(:我试图通过玩 .Replace() 自己去 View 那么是否有另一种方法来剥离它,或者实际上是同一家族中的另一种方法以我上面提到的方式提取它,或者我可以使用包含所有可能最常用类型的列表并使用 stringReplace 进行 foreach?

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

提前感谢!!

谁能显示一个易于理解的简单语法示例 获取参数名称?

【问题讨论】:

    标签: c# debugging reflection helpermethods


    【解决方案1】:

    关键是涉及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 中生成的常量) - 不需要提供它,也不需要步行堆栈来弄清楚。但是,您无法获取这样的参数。

    【讨论】:

    • 我明白了,我打算对 C# 5 进行检查,但我仍然在使用 c# 的冰山一角,所以不要着急(:至于性能成本,我会进行切换,使其仅在需要时而不是始终起作用,感谢参数的名称 Gravell 先生!
    • parameters.ToString() 产生 System.Reflection.ParameterInfo[] 而不是参数
    • @LoneXcoder 我从来没有说过要打电话给parameters.ToString();这是一个参数数组 - 您可以根据自己的选择对其进行迭代,获取每个参数的 .Name / .ParameterType...
    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2023-03-05
    • 2012-05-31
    相关资源
    最近更新 更多