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

C# 使用stacktrace/stackframe进行反射以获取方法名称和参数,c#,debugging,reflection,helpermethods,C#,Debugging,Reflection,Helpermethods,在写这个问题时,我遇到了一个问题 其他一些最相关的帖子…导致MSDN 但我无法提取所需的代码 我刚刚学习了如何使用基于st和sf的helper方法获取方法名,如下所示: public void setLogView(View ViewMode) { AAdToAppLog(); Lview_AH_AutomationLog.Sorting = SortOrder.Ascending; ColumnHeader ColHeadRo

在写这个问题时,我遇到了一个问题 其他一些最相关的帖子…导致MSDN

但我无法提取所需的代码

我刚刚学习了如何使用基于st和sf的helper方法获取方法名,如下所示:

    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()的调用,然后(通过ListView)报告方法的名称,我只添加了调用的时间

在这篇文章中,关于我对helper metod的实现,我想谈两件事: 我从sf.GetMethod收到的“FunctionName”很好,它抛出了我喜欢的给定方法的参数类型,只是它包含参数。type的父亲+祖父+曾祖父,但我只想要下面的类型:

System.Windows.Forms.View
这是最短的(:我试图通过玩.Replace()自己访问视图 那么,有没有其他方法可以将其剥离,或者实际上是同一系列中的另一种方法,可以按照我上面提到的方式提取它,或者我可以使用一个包含所有可能最常用类型的列表,并使用stringReplace执行foreach

更重要的是,如何获得方法(parameterName)?

提前多谢

有人能给出一个简单易懂的语法示例吗
获取参数名称的方法?

关键是涉及到
sf.GetMethod()
的行;如果您存储该行:

var method = sf.GetMethod();
string name = method.Name;
var parameters = method.GetParameters();
您可以访问完整签名,请注意,
.Name
只是简单的名称,而不是完整的声明类型名称,等等。如果需要更多上下文,您当然可以访问
方法.DeclaringType.Name
。请注意,您只能获取参数的声明;无法通过任何正常机制

但是!!!我还将注意到,所有这些都会带来与反射和堆栈遍历相关的性能代价。如果您有C#5编译器,您可能更喜欢:

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

这意味着编译器将自愿提供调用方的名称(作为IL中生成的常量)-不需要提供它,也不需要遍历堆栈来找出它。但是,您无法获得这样的参数。

我想,我本来打算检查一下C#5,但我仍处于C#的冰山一角,所以不要着急(:至于性能成本,我将进行切换,使其仅在需要时才起作用,而不是在任何时候都起作用,感谢参数的名称Mr Gravell!!检查Getparameters,看看它会产生什么结果是否有技巧添加参数类型而不使用它的祖先,如我的示例中使用的….Forms.View按其自身参数提取视图rs.ToString()生成
System.Reflection.ParameterInfo[]
而不是parameters@LoneXcoder我从未说过调用
参数。ToString()
;这是一个参数数组-您可以根据自己的选择进行迭代,得到每个参数的
.Name
/
.ParameterType
。。。
public void AAdToAppLog([CallerMemberName] string callerName = "")
{ ... }