2011-11-07 1 views
4

내 질문은 : 객체의 속성 값이 "예"라는 것을 알고있는 경우, 가능한 모든 항목을 확인하지 않고 어떻게 속성을 찾을 수 있습니까? 내가 디버깅 할 때 객체의 속성?C# debug - 어떤 속성이 있는지 알지 못하고 특정 값을 찾고 있습니다.

나는 조금 분명하지 않다고 생각한다. 예를 들어 ImagePart 객체가 있습니다. 디버깅 할 때 TargetName의 값을보고 싶습니다. 그렇게하기 위해, 나는 비공개 멤버를 통해 오브젝트 위로 마우스를 가져 가야합니다. 그러나 내가보고 싶어하는 가치가 훨씬 더 깊다면 나는 그것을 발견하는 데 어려움이있다.

+0

어쩌면 모든 속성을 조사 식 창에 추가하고 발생을 확인해야 할 수도 있습니다. – V4Vendetta

+0

내장 된 것으로 생각하지 않지만 매크로를 고려 했습니까? 어쩌면 디버거에서 형식 필드/속성 목록을 반복하는 방법이 있을까요? – Richard

+0

주소가 있으면 CheatEngine을 확인하는 데 도움이됩니다. 그러나 아마도 당신이 찾고있는 것과는 거리가 멀어 질 것입니다. – SBoss

답변

4

내가 올바르게 이해하면, 당신은 많은 성질을 가진 물건을 가지고있다. 그러면 당신은 C# reflection을 사용하여 모든 속성을 '스캔'할 수있는 그 방법으로 그 클래스를 만들 수있다.

string PropertyThatHasCertainValue(object Value) 
    { 
     Type myType = this.GetType(); 

     while(myType != typeof(object)) 
     { 
      foreach (PropertyInfo property_info in myType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) 
      { 
       if (object.Equals(property_info.GetValue(this, null), Value)) 
       { 
        return property_info.Name; 
       } 
      } 
      myType = myType.BaseType; 
     } 
     return "No property has this value"; 
    } 

그런 다음 시계에서는, 다음과 같은 시계 추가 :

분석 할 객체의 클래스에이 같은 방법을 만들기

MyObjectInstance.PropertyThatHasCertainValue(ValueYouAreLookingFor)

주 당신이 수도 매개 변수로 object을 사용하고 싶다면 시계에 입력하는 것이 더 쉽지만 VS 시계 창을 사용하면 숫자와 문자열뿐만 아니라 열거 형도 쉽게 입력 할 수 있습니다. Visual Studio 시계는 매우 강력합니다. 거의 항상 표현을 정확하게 평가합니다.

while 루프를 추가하여 모든 부모를 재귀 적으로 이동했습니다. BindingFlags.NonPublic은 클래스의 모든 개인 및 보호 된 메소드를 리턴하지만 기본 클래스의 개인 메소드는 리턴하지 않습니다. Object를 치기 전까지는 모든 기본 클래스를 탐색하여이 문제를 해결합니다.

+0

이것은 내가 필요한 것입니다. 나는 나중에 그것을 시험 할 것이고 그것이 효과가 있는지 알 것이다. –

+0

속성 값이 객체 인 경우이 코드는 더 깊게 파고 들지 않습니다. OP가 말한 것처럼 "재산이 훨씬 더 깊다"는 경우에는 작동하지 않을 것입니다. –

+0

@OmerRaviv 시계에서 그러한 객체를 정의 할 수있는 한 왜 작동하지 않는지는 알 수 없습니다 (한 줄로 처리해야합니다). 예를 들어'MyObjectInstance.PropertyThatHasCertainValue (새 MyObjectWithUsefulConstructor ("객체의 심층 속성을 구성하는 데 필요한 충분한 매개 변수"))'를 입력 할 수 있습니다. VS 시계는 매우 강력합니다 (2008/2010 같은 최신 VS에 대해 이야기합니다). – zmilojko

-1

VS 2010을 사용하면 속성을 고정 할 수 있습니다. 다음 번에 디버그 포인트를 누르면 해당 값이 자동으로 강조 표시됩니다. 더 많은 것을 위해 : http://weblogs.asp.net/pawanmishra/archive/2009/12/26/another-vs-2010-feature-pin-up.aspx

+0

이것은 OP 질문에 대답하지 않습니다 –

+0

@Omer : 위의 코멘트가 그의 질문에 대답하지 않는다는 것을 어떻게 알 수 있습니까? 초기 반응의 대부분은 quickWatch/watch 윈도우를 추가하는 것이 었습니다. 그것들이 정확하지 않다면 질문 자체가 모호하다고 말할 것입니다. 나는 당신의 대답을 보았습니다, 당신의 대답에서 당신은 제공했습니다. 심지어 거기에서, 당신은 비슷한 것을하고 있습니다, 그것은 당신이 다른 도구를 사용했다는 것입니다. 당신의 대답이 맞다면, MOLE (http://weblogs.asp.net/pawanmishra/archive/2009/12/13/mole-visual-studio-visualizer.aspx)을 사용한다고 말할 수 있습니다. –

+0

불쾌 해하지 마십시오 - 귀하의 블로그 게시물이 우수합니다! 그러나 OP의 질문이 "디버깅 할 때 이름이나 값을 기반으로 어떻게 찾을 수 있습니까?"라고 정확하게 이해하면됩니다. Pinning은 관심있는 부동산을 이미 찾은 경우에만 도움이됩니다. Mole을 사용하면 OP의 질문에 대한 또 다른 정답이 될 수 있습니다. –

-1

비슷한 질문이 here에 부탁되었습니다. my answer을 참조하십시오. 내가 말한 검색 기능은 속성 값과 마찬가지로 작동합니다.

관련 문제