Отражение с помощью 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) - не нужно ни указывать его, либо идти по стеку, чтобы выяснить это. Однако вы не можете получить такие параметры.

Другие вопросы по тегам