2016-06-16 6 views
4

LinqPadのNuGet.VersioningパッケージのNuGetVersionを使用しています。私はDump()そのプロパティを調べることを試みていますが、通常のダンプの代わりに私はちょうど文字列表現を取得します。例えばなぜLinqPadは、いくつかの型がToString()をダンプするときにそれを実行しますか?

、この:

var v = new NuGetVersion("1.0.0"); 
v.Dump(); 

は、出力ウィンドウに、次の表示:

1.0.0 

LinqPadは、いくつかのタイプがダンプされたときにToString()を実行し、そしてどのようにこの動作を変更する理由は、誰もが知っています?

+1

はそれではありませんあなたは確かにあります公共の財産のみ? 'Dump()'は、よく知られている型から継承していないオブジェクトのパブリックプロパティをダンプするだけだと思います。 – flindeberg

+0

はい、いくつかの公開プロパティがあります。ソースはここにあります:https://github.com/NuGet/NuGet.Client/blob/dev/src/NuGet.Core/NuGet.Versioning/NuGetVersion.cs –

+0

私は[Joe](http:// stackoverflow。 com/users/46223/joe-albahari)がこれに答えることができます。 –

答えて

5

一般に、オブジェクトがSystem.IFormattableを実装する場合、LINQPadはプロパティを拡張するのではなく、ToString()を呼び出します。

あなたはLINQPadのICustomMemberProviderを使用していますマイ拡張で拡張メソッドを書くことで、これをオーバーライドすることができます:

static class MyExtensions 
{ 
    public static object ForceExpand<T> (this T value) 
     => value == null ? null : new Expanded<T> (value); 

    class Expanded<T> : ICustomMemberProvider 
    { 
     object _instance; 
     PropertyInfo[] _props; 

     public Expanded (object instance) 
     { 
      _instance = instance; 
      _props = _instance.GetType().GetProperties(); 
     } 

     public IEnumerable<string> GetNames() => _props.Select (p => p.Name); 
     public IEnumerable<Type> GetTypes() => _props.Select (p => p.PropertyType); 
     public IEnumerable<object> GetValues() => _props.Select (p => p.GetValue (_instance)); 
    } 
} 

し、このようにそれを呼び出す:

new NuGetVersion("1.2.3.4").ForceExpand().Dump(); 
+0

ありがとうジョー。これを行うためにオーバーロードを追加することを検討しますか? 'v.Dump(forceExpand:true);のようなもの? –

+0

上記のようなForceExpand()メソッドのダンプオーバーロードに対する利点は、個々のプロパティで指定できることです。 –

関連する問題