Отражение с помощью stacktrace / stackframe для получения как имени метода, так и параметров
Во время написания темы вопроса я наткнулся на какой-то другой связанный пост... ведущий к 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) имя метода, и я просто добавил время вызова.
есть две вещи, которые я хотел бы рассмотреть в этом посте, о моей реализации этого вспомогательного метода: "FunctionName", которое я получаю из sf.GetMethod хорошо, что он выбрасывает тип параметра данного метода, мне понравилась идея, только что он содержит параметр. Тип отца + дедушка + прадедушка, но я хотел бы только нижний тип:
System.Windows.Forms.View
это один из самых коротких (: и я попытался добраться до View самостоятельно, играя с.Replace(), так что нет другого способа сократить его или фактически другого метода в том же семействе, который извлекает его так, как я упоминал выше, или я мог бы использовать список, содержащий все возможные наиболее часто используемые типы и сделать foreach с stringReplace?
и более важно, как я могу получить метод (parameterName), а?
Заранее большое спасибо!!
Может кто-то показать Легко понять, Простой синтаксис Пример получения имени параметра?
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) - не нужно ни указывать его, либо идти по стеку, чтобы выяснить это. Однако вы не можете получить такие параметры.