2016-06-16 3 views
4

LinqPad의 NuGet.Versioning 패키지의 NuGetVersion을 사용하고 있습니다. Dump() 그것의 속성을 검사하려고하지만, 대신 일반 덤프 그냥 문자열 표현을 얻을. 예를 들어LinqPad가 덤프 될 때 ToString()을 어떤 유형에서 실행하는 이유는 무엇입니까?

이 :

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

가 출력 창에 다음과 같은 표시 :

1.0.0 

LinqPad 어떤 종류의 덤프 때 ToString()을 실행하는 방법이 동작을 변경하는 사람이 왜 알고 있나요 ?

+1

당신에게 확신 : 다음

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

과 같이 호출 :

당신은 LINQPad의 ICustomMemberProvider 사용 내 확장에서 확장 메서드를 작성하여이 메소드를 오버라이드 (override) 할 수 공공 재산 만? 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는 개체가 System.IFormattable 인 경우 속성을 확장하지 않고 ToString()을 호출합니다. 그게 아니다

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

감사합니다. 이 작업을 수행하기 위해 과부하를 추가 하시겠습니까? 'v.Dump (forceExpand : true);와 같은 것? –

+0

위와 같은 ForceExpand() 메서드의 장점은 덤프 오버로드에 비해 개별 속성에 지정할 수 있다는 점입니다. –