Как довольно печатать метод итератора -- c# поле с участием visual-studio поле с участием yield поле с участием coroutine поле с участием object-dumper пол Связанный проблема

How to pretty print the Iterator Method


1
vote

проблема

русский

Я хочу получить имя метода со своими аргументами метода итератора и я борюсь, чтобы найти простое решение. Итераторы генерируются компилятором в результате. Имя метода источника и аргументы теперь находятся в сгенерированном имени класса, а также в полях соответственно (с некоторыми символами Magic & lt; & GT; + _ P>

В непосредственном окне Visual Studio, когда я вхожу в метод iTerator, я получаю имя метода, и это аргументы в красивом виде. Они используют некоторые пользовательские принтеры или, возможно, есть некоторые помощники для этого?

Редактировать:

Основная цель - получить COROUTINE ASYNC CALL CALL CALL.

 <код> Program.Test(a, b)   Program.TestB(b)   

Вот пример:

 <код> using System; using System.Collections; using System.Linq;  class Program {     static IEnumerable TestB(string b)     {         yield return b;         yield return b;     }      static IEnumerable Test(string a, string b)     {         yield return a;         yield return TestB(b);     }      static void Main(string[] args)     {         var iterator = Test("foo", "bar");          // Immediate Window         // ================         // iterator         // {Program.Test}         //     a: null         //     b: null         //     System.Collections.Generic.IEnumerator<System.Object>.Current: null         //     System.Collections.IEnumerator.Current: null          Console.WriteLine(iterator);         // prints:         // Program+<Test>d__0          foreach (var field in iterator.GetType().GetFields())             Console.WriteLine(field);         // prints:         // System.String a         // System.String <>3__a         // System.String b         // System.String <>3__b     } }   

Английский оригинал

I want to get the method name with its arguments of Iterator Method and I am struggling to find a simple solution. Iterators are generated by a compiler as a result the source method name and it's arguments are now in a generated class name and it's fields respectively (with some magic <>+_d symbols).

In Immediate window of Visual Studio when I enter the iterator method I get the method name and it's arguments in a pretty way. Are they using some custom printers or maybe there is some helpers to do that?

Edit:

The main goal is to get the coroutine async call stack.

Program.Test(a, b)   Program.TestB(b) 

Here is an example:

using System; using System.Collections; using System.Linq;  class Program {     static IEnumerable TestB(string b)     {         yield return b;         yield return b;     }      static IEnumerable Test(string a, string b)     {         yield return a;         yield return TestB(b);     }      static void Main(string[] args)     {         var iterator = Test("foo", "bar");          // Immediate Window         // ================         // iterator         // {Program.Test}         //     a: null         //     b: null         //     System.Collections.Generic.IEnumerator<System.Object>.Current: null         //     System.Collections.IEnumerator.Current: null          Console.WriteLine(iterator);         // prints:         // Program+<Test>d__0          foreach (var field in iterator.GetType().GetFields())             Console.WriteLine(field);         // prints:         // System.String a         // System.String <>3__a         // System.String b         // System.String <>3__b     } } 
</div
              
         
         

Список ответов

0
 
vote

Вы можете использовать атрибут DebuggerTypeProxy и установите его на ваш <код> Program класса. Это было бы очень похоже на пример, данный на Страница документации MSDN , которая показывает, как отображать Hashtable, вместо перечисленного. Должен быть достаточно легко преобразовать это, чтобы вместо этого использовать перечисленные перечисленные. Возможно, вам может потребоваться создать свой собственный класс, который наследует от Ienumerable, хотя для этого для работы. Не уверен, будет ли он работать над неявным перечисником, но опять же, вы принимаете ярлыки здесь и хотите сахарного покрытия, они часто не идут хорошо вместе.

 <код> [DebuggerDisplay("{value}", Name = "{key}")] internal class KeyValuePairs {     private IDictionary dictionary;     private object key;     private object value;      public KeyValuePairs(IDictionary dictionary, object key, object value)     {         this.value = value;         this.key = key;         this.dictionary = dictionary;     } }  [DebuggerDisplay("Count = {Count}")] [DebuggerTypeProxy(typeof(HashtableDebugView))] class MyHashtable : Hashtable //this would be Program {     private const string TestString = "This should not appear in the debug window.";      internal class HashtableDebugView     {         private Hashtable hashtable;         public const string TestString = "This should appear in the debug window.";         public HashtableDebugView(Hashtable hashtable)         {             this.hashtable = hashtable;         }          [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]         public KeyValuePairs[] Keys         {             get             {                 KeyValuePairs[] keys = new KeyValuePairs[hashtable.Count];                  int i = 0;                 foreach(object key in hashtable.Keys)                 {                     keys[i] = new KeyValuePairs(hashtable, key, hashtable[key]);                     i++;                 }                 return keys;             }         }     } }   
 

You can use a DebuggerTypeProxy attribute and set it on your Program class. It would be very similar to the example given on the MSDN documentation page, which shows how to display a HashTable, instead of an Enumarable. It should be rather easy to convert this to use an Enumerable instead. You might need to create your own class that inherits from IEnumerable though for this to work. Not sure if it would work on a implicit enumerable, but then again, you're taking shortcuts here and want sugar coating, these often do not go well together.

[DebuggerDisplay("{value}", Name = "{key}")] internal class KeyValuePairs {     private IDictionary dictionary;     private object key;     private object value;      public KeyValuePairs(IDictionary dictionary, object key, object value)     {         this.value = value;         this.key = key;         this.dictionary = dictionary;     } }  [DebuggerDisplay("Count = {Count}")] [DebuggerTypeProxy(typeof(HashtableDebugView))] class MyHashtable : Hashtable //this would be Program {     private const string TestString = "This should not appear in the debug window.";      internal class HashtableDebugView     {         private Hashtable hashtable;         public const string TestString = "This should appear in the debug window.";         public HashtableDebugView(Hashtable hashtable)         {             this.hashtable = hashtable;         }          [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]         public KeyValuePairs[] Keys         {             get             {                 KeyValuePairs[] keys = new KeyValuePairs[hashtable.Count];                  int i = 0;                 foreach(object key in hashtable.Keys)                 {                     keys[i] = new KeyValuePairs(hashtable, key, hashtable[key]);                     i++;                 }                 return keys;             }         }     } } 
</div
 
 

Связанный проблема

1  WIX Набор инструментов Build не удается после обновления от .NET 4.0 до 4.6.1: не может загрузить MSBuild Wrapper?  ( Wix toolset build fails after upgrading from net 4 0 to 4 6 1 cannot load msbu ) 
Так после обновления всего проекта до 4.6.1 Я получаю эту ошибку, выброшенную нагревом, когда я его создаю: <код> Failed to load MSBuild wrapper object: Cou...

5  Можем ли мы использовать ответ .Flush () вместо ответа. Денды ()  ( Can we use response flush instead of response end ) 
<Код> Response.End() генерирует <код> ThreadAbortException . Использование <код> HttpContext.Current.ApplicationInstance.CompleteRequest вместо этого не р...

2  Обработка ошибок в свойствах, я знаю, что это плохо, нужно исправить, хотя  ( Error handling in properties i know its bad need fix though ) 
Я знаю свою плохую практику, чтобы поставить обработку ошибок в свойствах, я просто хочу знать , где я должен положить ошибку обработки ошибок. Я знаю, что з...

1  Разница между несколькими наследованиями и интерфейсами в C #  ( Difference between multiple inheritance and interfaces in c sharp ) 
делает C # действительно поддерживать многократное наследование. Люди говорят, что он поддерживает многократное наследование в виде интерфейсов? Но я не думаю...

0  Как нарисовать в автономном режиме круг 1500 метров в диапазоне Geocoordinate в Windows Phone 8  ( How to draw offline circle of 1500 meters range over the geocoordinate in window ) 
Я хочу нарисовать автономный круг над геокоординаном в Windows Phone Этот круг составляет 1500 метров, и он ищет цель в этом диапазоне это мой образ, где у...

3  Как мне расположить эллипс на сетке Silverlight?  ( How do i position an ellipse on a silverlight grid ) 
Я создаю приложение Silverlight, которое позволит вам нажать в два места на экране и нарисовать эллипс, основной ось которого начинается и заканчивается в мес...

0  Ошибка структуры объекта: ошибка загрузки указанного ресурса метаданных  ( Entity framework error error loading specified metadata resource ) 
Я знаю, что это известная проблема, но решение для моего случая не в других вопросах, я думаю. У меня есть проект в C #. В этом проекте у меня есть мой EDMX...

1  Как я могу прочитать все предметы питания?  ( How do i read all feed items ) 
Я хочу прочитать все элементы подачи в C #. Решения, которые я обнаружил, только для новейших элементов, таких как только последние 10 дней. У кого-нибудь е...

0  Как бы я пошел на рисование в программе краски с чувствительностью давления?  ( How would i go about drawing in a paint program with pressure sensitivity ) 
Я пишу программу краски в родах, используя C # .NET / WinForms и чувствительность к давлению является обязательным. У меня все настроено и получаю информацию ...

2  Обращайтесь с событиями для динамического (время выполнения) - vb.net  ( Handle events for dynamic run time controls vb net ) 
У меня есть элемент управления WebBrowser, который создается и добавляется в форму во время выполнения. Как подключить этот элемент управления подпрограммой...

-2  Гольф HCP Calculator  ( Golf hcp calculator ) 
Я работаю над программой в ASP.NET MVC, где моя цель - сделать показатель для гольфа. в Golf у каждого игрока есть гандикап, который дает им ряд дополнитель...

4  Создайте VCARD, который можно скачать на Android с помощью ASP.NET  ( Generate vcard that can be downloaded on android using asp net ) 
Я пробую довольно некоторое время, чтобы сгенерировать VCARD, используя ASP.NET (C #), которые можно загрузить на устройство Android. Процесс генерации карт...

0  Streaminsight и долгосрочные запросы  ( Streaminsight and long running queries ) 
У меня есть приложение, построенное на вершине Streaminsight 1.2, который имеет несколько постоянных запросов, выполняющих некоторые расчеты в операторах опре...

0  Присоединиться к запросу с LINQ  ( Join query with linq ) 
Я пытаюсь здесь сделать несколько левых присоединиться к запросу LINQ, но я бы сказал, что понятия не имею, как материализовать эту идею. в основном вот 3 с...

-4  Будет вернуться внутрь памяти утечки для петли?  ( Will a return inside of a for loop leak memory ) 
в основном все, что мне нужно знать, является ли возвращение внутри цикла для цикла в C #. <код> for (int i = 0; i <= 20; i++ ) { if(i == 10) re...

Связанный проблема

1  WIX Набор инструментов Build не удается после обновления от .NET 4.0 до 4.6.1: не может загрузить MSBuild Wrapper? 
5  Можем ли мы использовать ответ .Flush () вместо ответа. Денды () 
2  Обработка ошибок в свойствах, я знаю, что это плохо, нужно исправить, хотя 
1  Разница между несколькими наследованиями и интерфейсами в C # 
0  Как нарисовать в автономном режиме круг 1500 метров в диапазоне Geocoordinate в Windows Phone 8 
3  Как мне расположить эллипс на сетке Silverlight? 
0  Ошибка структуры объекта: ошибка загрузки указанного ресурса метаданных 
1  Как я могу прочитать все предметы питания? 
0  Как бы я пошел на рисование в программе краски с чувствительностью давления? 
2  Обращайтесь с событиями для динамического (время выполнения) - vb.net 
-2  Гольф HCP Calculator 
4  Создайте VCARD, который можно скачать на Android с помощью ASP.NET 
0  Streaminsight и долгосрочные запросы 
0  Присоединиться к запросу с LINQ 
-4  Будет вернуться внутрь памяти утечки для петли?