[C#] C #에서 전체 개체를 로그에 덤프하는 가장 좋은 방법은 무엇입니까?

따라서 런타임에 현재 객체의 상태를 보려면 Visual Studio Immediate 창이 제공하는 것이 정말 좋습니다. 간단하게

? objectname

객체의 멋진 ‘덤프’를 나에게 줄 것입니다.

코드 에서이 작업을 수행하는 쉬운 방법이 있습니까? 그래서 로깅 할 때 비슷한 작업을 수행 할 수 있습니까?



답변

Linq 샘플 과 함께 제공되는 ObjectDumper 코드를 기반으로 할 수 있습니다 .
관련 질문 에 대한 답을 살펴보고 샘플을 얻으십시오.


답변

더 큰 객체 그래프의 경우 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 Locals 창의 스크린 샷

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 ...