在写问题主题时遇到其他一些最相关的帖子。。。导致MSDNhttp://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)方法的名称,我只添加了调用的时间。
关于我对helper metod的实现,我想在这篇文章中解决两件事:我从sf收到的"FunctionName"。GetMethod很好,它抛出了给定方法的参数类型。我喜欢这个想法,只是它包含参数。类型的父亲+祖父+曾祖父,但我只喜欢底部的类型:
System.Windows.Forms.View
这是最短的(:并且我试图通过玩.Replace()自行访问View那么,有没有其他方法可以将其剥离,或者实际上是同一家族中的另一种方法,以我上面提到的方式提取它,或者我可以使用一个包含所有可能最常用类型的列表,并用stringReplace进行foreach?
更重要的是,我如何获得方法(parameterName)
提前感谢!!
有人能展示一个易于理解、简单的语法示例吗获取参数名称?
关键在于涉及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中生成的常量)-不需要提供它,也不需要遍历堆栈来计算它。但是,您无法获得这样的参数。