gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:22:47 26 4
gpt4 key购买 nike

写题目的时候碰到的其他一些最相关的帖子...导致 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() 来自己查看那么是否有另一种方法可以剥离它,或者实际上是同一个系列中的另一种方法,可以按照我上面提到的方式提取它,或者我可以使用一个包含所有可能最常用类型的列表,并用 stringReplace 做一个 foreach?

更重要的是,我如何获得方法(参数名称)?

提前致谢!!

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

最佳答案

问题的症结在于涉及 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# - 使用 stacktrace/stackframe 进行反射以获取方法名称和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12158882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com