2016-06-16 3 views
4

Я использую NuGetVersion от пакета NuGet.Versioning в LinqPad. Я пытаюсь проверить 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

В общем, LINQPad вызывает ToString(), а не расширяя свойства, если объект реализует System.IFormattable.

Вы можете переопределить это, написав метод расширения в My Extensions, которые использует 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(), подобного вышеперечисленному над перегрузкой Dump, заключается в том, что его можно указать для отдельных свойств. –