Как я могу сбросить обычные свойства на IEnumerable в Linqpad - PullRequest
3 голосов
/ 21 октября 2010

Если у меня есть объект, который, помимо прочего, является IEnumerable, и я выкидываю этот объект, я получаю перечисляемые значения.

Есть ли способ заставить Linqpad перечислить другие свойства:

Пример Se ниже: Могу ли я получить Dump для включения свойств Hello и digits?

void Main()
{
    var t = new test();
    var d = new Dictionary<string,string> {{"Hello","World"},{"Good by","Sky"}};

    t.Dump();
    d.Dump();
}

// Define other methods and classes here

public class test : IEnumerable
{
    public string Hello { get { return "World"; }}
    public List<int> digits { get { return new List<int> {0,1,2,3,4,5,6,7,8,9}; }}

    public IEnumerator GetEnumerator() { yield return "Hej"; }
}

Ответы [ 3 ]

6 голосов
/ 23 октября 2010

Вы можете написать метод расширения DumpPayload следующим образом:

void Main()
{
    var t = new test();
    t.DumpPayload();
}

public static class Extensions
{
    public static void DumpPayload (this IEnumerable o)
    {
        if (o == null)
        {
            o.Dump();
            return;
        }
        var d = new Dictionary<string,object>();        
        foreach (var member in o.GetType().GetProperties())
            try
            {
                d[member.Name] = member.GetValue (o, null);
            }
            catch (Exception ex)
            {
                d[member.Name] = ex;
            }           
        d["AsEnumerable"] = o;
        d.Dump();
    }   
}

Если вы добавите этот метод расширения в «Мои расширения», он будет доступен для всех запросов.

Другим решением является реализация ICustomMemberProvider в классе тестирования:

public class test : IEnumerable, ICustomMemberProvider
{
    public string Hello { get { return "World"; }}
    public List<int> digits { get { return new List<int> {0,1,2,3,4,5,6,7,8,9}; }}

    public IEnumerator GetEnumerator() { yield return "Hej"; }

    IEnumerable<string> ICustomMemberProvider.GetNames() 
    {
        return "Hello Enumerator".Split();
    }

    IEnumerable<Type> ICustomMemberProvider.GetTypes ()
    {
        return new [] { typeof (string), typeof (IEnumerable) };
    }

    IEnumerable<object> ICustomMemberProvider.GetValues ()
    {
        return new object [] { Hello, this.OfType<Object>() };
    }   
}

Обратите внимание, что если класс теста определен в другой сборке, вам не нужно ссылаться на LINQPad для реализации ICustomMemberProvider .Вы можете просто вставить следующее определение в свой проект, и LINQPad подберет его:

namespace LINQPad
{
   public interface ICustomMemberProvider
   {
      IEnumerable<string> GetNames ();
      IEnumerable<Type> GetTypes ();
      IEnumerable<object> GetValues ();
   }
}
1 голос
/ 21 октября 2010

Насколько я могу судить, реализует ли объект, который вы пытаетесь создать дамп, IEnumerable, LINQPad всегда хочет вывести его в виде списка IEnumerable. Правильное избавление от интерфейса показывает свойства Hello и digits в выводимой информации.

Исходя из этой ссылки кажется, что вы можете написать свой собственный дамп, который выполняет что-то вроде LINQPad, перечисляя коллекцию и всех ее свойств, затем выводя все это как строку XHTML. Я не пробовал это.

0 голосов
/ 21 октября 2010

Использовать сериализатор?

Json.NET сделает все это за вас в формате json.

Newtonsoft.Json.JsonConvert.SerializeObject (t, Newtonsoft.Json.Formatting.Отступ)

если вы не хотите использовать json, выберите нужный сериализатор, или вам просто нужно будет сделать то же, что и сериализатор, использовать отражение для итерации свойств объекта.

...