如何在Linqpad中的IEnumerable上转储正常属性

Dav*_*son 3 ienumerable dump linqpad

如果我有一个对象,其中包括IEnumerable,我转储此对象,我得到枚举值.

有没有办法让Linqpad列出其他属性:

以下示例:我可以获得Dump以包含Hello和数字属性吗?

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"; }
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*ari 6

您可以编写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();
    }   
}
Run Code Online (Sandbox Code Playgroud)

如果您将此扩展方法放入"我的扩展程序",它将可用于所有查询.

另一种解决方案是在测试类中实现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>() };
    }   
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果测试类在另一个程序集中定义,则无需引用LINQPad即可实现ICustomMemberProvider.您只需将以下定义粘贴到项目中,LINQPad就会将其选中:

namespace LINQPad
{
   public interface ICustomMemberProvider
   {
      IEnumerable<string> GetNames ();
      IEnumerable<Type> GetTypes ();
      IEnumerable<object> GetValues ();
   }
}
Run Code Online (Sandbox Code Playgroud)