따라서 런타임에 현재 객체의 상태를 보려면 Visual Studio Immediate 창이 제공하는 것이 정말 좋습니다. 간단하게
? objectname
객체의 멋진 ‘덤프’를 나에게 줄 것입니다.
코드 에서이 작업을 수행하는 쉬운 방법이 있습니까? 그래서 로깅 할 때 비슷한 작업을 수행 할 수 있습니까?
답변
답변
더 큰 객체 그래프의 경우 Json을 사용하지만 전략이 약간 다릅니다. 먼저 호출하기 쉬운 정적 클래스와 Json 변환을 래핑하는 정적 메소드가 있습니다 (참고 :이를 확장 메소드로 만들 수 있습니다).
using Newtonsoft.Json;
public static class F
{
public static string Dump(object obj)
{
return JsonConvert.SerializeObject(obj);
}
}
그런 다음에 Immediate Window
,
var lookHere = F.Dump(myobj);
look Locals
앞에 $ 가 붙은 창 에 자동으로 표시 되거나 시계를 추가 할 수 있습니다. Value
인스펙터 에서 컬럼 의 오른쪽 에는 드롭 다운 캐럿이있는 돋보기가 옆에 있습니다. 드롭 다운 캐럿을 선택하고 Json Visualizer를 선택하십시오.
Visual Studio 2013을 사용하고 있습니다.
답변
나는 이것을하는 더 좋은 방법이 있다고 확신하지만, 과거에는 객체를 내가 기록 할 수있는 문자열로 직렬화하기 위해 다음과 같은 방법을 사용했다.
private string ObjectToXml(object output)
{
string objectAsXmlString;
System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(output.GetType());
using (System.IO.StringWriter sw = new System.IO.StringWriter())
{
try
{
xs.Serialize(sw, output);
objectAsXmlString = sw.ToString();
}
catch (Exception ex)
{
objectAsXmlString = ex.ToString();
}
}
return objectAsXmlString;
}
메소드가 직렬화 된 오브젝트가 아니라 예외를 리턴 할 수도 있으므로 로그하려는 오브젝트가 직렬화 가능한지 확인해야합니다.
답변
Visual Studio Immediate Window를 사용할 수 있습니다
이것을 붙여 넣으십시오 ( actual
명명하게 객체 이름으로 변경 하십시오).
Newtonsoft.Json.JsonConvert.SerializeObject(actual);
JSON으로 객체를 인쇄해야합니다.
textmechanic 텍스트 도구 또는 notepad ++를 통해 복사하고 이스케이프 된 따옴표 ( \"
)와 "
개행 ( \r\n
)을 빈 공간으로 바꾼 다음 큰 따옴표 ( "
)를 시작과 끝에서 제거 하고 더 읽기 쉽게 jsbeautifier 에 붙여 넣으십시오 .
OP의 의견에 업데이트
public static class Dumper
{
public static void Dump(this object obj)
{
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(obj)); // your logger
}
}
그러면 객체를 덤프 할 수 있습니다.
이것이 시간을 절약하기를 바랍니다.
답변
ServiceStack.Text 에는 정확하게 이것을 수행 하는 T.Dump () 확장 메소드 가 있으며, 모든 유형의 모든 특성을 읽기 쉬운 형식으로 재귀 적으로 덤프합니다.
사용법 예 :
var model = new TestModel();
Console.WriteLine(model.Dump());
출력 :
{
Int: 1,
String: One,
DateTime: 2010-04-11,
Guid: c050437f6fcd46be9b2d0806a0860b3e,
EmptyIntList: [],
IntList:
[
1,
2,
3
],
StringList:
[
one,
two,
three
],
StringIntMap:
{
a: 1,
b: 2,
c: 3
}
}
답변
다음은 깔끔한 형식의 평면 객체를 작성하는 어리석은 간단한 방법입니다.
using Newtonsoft.Json.Linq;
Debug.WriteLine("The object is " + JObject.FromObject(theObjectToDump).ToString());
계속해서 객체는 먼저로 내부 JSON 표현으로 JObject.FromObject
변환 된 다음로로 JSON 문자열로 변환됩니다 ToString
. (물론 JSON 문자열은 간단한 객체를 아주 잘 표현한 것입니다. 특히 줄 ToString
바꿈과 들여 쓰기가 포함되어 있기 때문 입니다.) “ToString”은 물론 ( +
문자열과 객체를 연결하기 위해을 사용하여 암시되기 때문에) 외부 적입니다. 여기에 지정하고 싶습니다.
답변
리플렉션을 사용하고 모든 객체 속성을 반복 한 다음 해당 값을 가져 와서 로그에 저장할 수 있습니다. 형식은 실제로 사소합니다 (\ t를 사용하여 객체 속성과 해당 값을 들여 쓸 수 있습니다).
MyObject
Property1 = value
Property2 = value2
OtherObject
OtherProperty = value ...