3

とりわけIEnumerableであるオブジェクトがあり、このオブジェクトをダンプすると、列挙値が取得されます。

Linqpadに他のプロパティを一覧表示させる方法はありますか?

以下の例: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"; }
}
4

3 に答える 3

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();
    }   
}

この拡張機能を「マイ拡張機能」に入れると、すべてのクエリで利用できるようになります。

別の解決策は、テストクラスに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>() };
    }   
}

テストクラスが別のアセンブリで定義されている場合、 ICustomMemberProviderを実装するためにLINQPadを参照する必要はないことに注意してください。次の定義をプロジェクトに貼り付けるだけで、LINQPadがそれを取得します。

namespace LINQPad
{
   public interface ICustomMemberProvider
   {
      IEnumerable<string> GetNames ();
      IEnumerable<Type> GetTypes ();
      IEnumerable<object> GetValues ();
   }
}
于 2010-10-23T03:59:25.620 に答える
1

ダンプしようとしているオブジェクトが実装されているかどうかがわかる限り、IEnumerableLINQPadは常にそれをIEnumerableリストとしてダンプしたいと考えています。インターフェイスを削除すると、ダンプされた情報のプロパティHelloとプロパティが正しく表示されます。digits

このリンクから、コレクションそのすべてのプロパティを列挙し、すべてをXHTML文字列として出力することで、LINQPadのようなものを実現する独自のダンプを作成できるようです。私はこれを試していません。

于 2010-10-21T14:51:35.710 に答える
0

シリアライザーを使用しますか?

Json.NETは、これらすべてをjson形式で実行します。

Newtonsoft.Json.JsonConvert.SerializeObject(t、Newtonsoft.Json.Formatting.Indented)

jsonが必要ない場合は、必要なシリアライザーを選択するか、シリアライザーが行うことを実行する必要があります。リフレクションを使用して、オブジェクトのプロパティを繰り返します。

于 2010-10-21T14:56:56.243 に答える