2012-01-03 4 views
2

저는 Job이라는 객체를 가지고 있고 그 안에 문자열, int 및 열거 형을 공용 객체로 가지고 있습니다. 각 작업은 Queue에 저장되고 프로세스의 대기열을 반복합니다.컨테이너 객체 내의 모든 공용 객체 (문자열/int/enum) 값을 Console에 쓰십시오.

내가 원하는 것은 각 작업을 Dequeue() 할 때마다 각 작업을 반복적으로 수행하고 공용 객체 이름과 값을 콘솔에 쓸 수 있다는 것입니다.

콘솔에 개체 이름을 쓰는 방법을 알았지 만 값을 분명히 쓸 수는 있지만 문제는 작업 개체에서 각 공용 문자열/int/enum을 가져 오는 방법을 모르겠다는 것입니다.

나는 C# object dumper C#: How to get all public (both get and set) string properties of a type How to select all the values of an object's property on a list of typed objects in .Net with C# 을 검토 한하지만이 허용 답변 중 하나를 사용하는 것이 이해가 안 돼요. 여기

class Job 
    { 
     #region Constructor 
     public Job() 
     { 
     } 
     #endregion 

     #region Accessors 
     public int var_job { get; set; } 
     public jobType var_jobtype { get; set; } //this is an enum 
     public string var_jobname { get; set; } 
     public string var_content { get; set; } 
     public string var_contenticon { get; set; } 
     #endregion 
    } 

변수의 이름을 반환하는 것 코드입니다 : ( https://stackoverflow.com/a/2664690/559988에서) I는 다음과 같이 콘솔에 출력이있을 것이다

이상적으로
GetName(new {Job.var_content}) //how I call it 
static string GetName<T>(T item) where T : class 
{ 
    return typeof(T).GetProperties()[0].Name; 
} 

여기

내 작업 클래스에 코드입니다 :

Queuing Jobs Now 
-------------------- 
var_job = its value 
var_jobtype = its value 
var_jobname = its value 
var_content = its value 
var_contenticon = its value 

생각들? 토니 홉 킨슨의 제안 당

+0

리플렉션을 사용하여 속성을 반복하고 값을 가져오고 tostring() 메서드를 사용합니다. 또는 클래스에서 멋진 출력을 생성하는 toString (또는 다른 메서드)을 재정의합니다. 물론 당신은 그것을 유지해야 할 것입니다 ... –

+0

나는 점차적으로 여기 예제를 보면서 그것을 얻고 있다고 생각한다 : http://msdn.microsoft.com/en-us/library/aa332475(v=vs.71)) .aspx 얻으면 솔루션을 게시 할 것입니다. – cvocvo

+2

왜 [ToString] (http://msdn.microsoft.com/en-us/library/system.object.tostring.aspx)을 덮어 쓸 수 없습니까 (또는 다른 이름으로 유사한 방법을 쓰십시오) 직업 클래스? –

답변

3

나는 당신이 생각하는 무엇 ' 찾고있는 사람은 PropertyInfo.GetValue입니다. 아마도 이런 일이 (그래서 희망대로 작동합니다 메모리에서) 도움이 될 것입니다 : 당신은 또한 당신이 경향이 경우 객체의 필드와 비슷한 대신 속성들을 사용할 수

public static void DumpProperties(this Object dumpWhat) 
{ 
    foreach(PropertyInfo prop in dumpWhat.GetType().GetProperties()) 
     Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(dumpWhat, BindingFlags.GetProperty, null, null, null).ToString()); 
} 

.

public static void DumpFields(this Object dumpWhat) 
{ 
    foreach(FieldInfo fld in dumpWhat.GetType().GetFields()) 
     Console.WriteLine("{0} = {1}", fld.Name, fld.GetValue(dumpWhat, BindingFlags.GetField, null, null, null).ToString()); 
} 

다음은 콘솔로 덤프되지만 모든 스트림에 쓸 수 있도록 변경 될 수 있도록 작성되어야합니다.

업데이트

당신이 설정되는보다는 try...catch에 포장하지 않은 속성에서 NullReferenceException 년대를 받기 시작하면 PropertyInfo.GetValue에서 반환 된 값에 대한 몇 가지 사전 검사 수행해야합니다

public static void DumpProperties(this Object dumpWhat) 
{ 
    foreach(PropertyInfo prop in dumpWhat.GetType().GetProperties()) 
    { 
     string propVal = prop.GetValue(dumpWhat, BindingFlags.GetProperty, null, null, null) as string; 

     if (propVal != null) 
      Console.WriteLine("{0} = {1}", prop.Name, propVal); 
    } 
} 
+0

첫 번째 DumpProperties 메서드가 NullReferenceException을 throw하도록 Job의 모든 값을 항상 초기화하지는 않지만 다음과 같이 처리합니다. void DumpProperties (Object dumpWhat) { foreach (PropertyInfo prop in dumpWhat.GetType()). GetProperties()) { try { {{0} = {1} ", prop.Name, prop.GetValue (dumpWhat, BindingFlags.GetProperty, null, null, null) .ToString()) ; } 캐치 (NullReferenceException이) { } } } – cvocvo

+0

@cvocvo - 그 다음 변환되어 있지 않은 경우는 null의 경우 확인 먼저 GetValue에서 개체를 얻기 위해, 그리고 것입니다 처리의 청소 방법 문자열로. 이것이 예외적 인 이유는 Exception과 Exception handling이 비싸기 때문입니다. 나는 그 상황을 어떻게 처리 할 것인가에 대한 예로써 나의 대답을 업데이트 할 것이다. –

1

, 당신은 당신의 작업 클래스에 다음 메서드 재정의를 추가 할 수 있습니다 :

public override string ToString() 
    { 
     string foo = 
      string.Format("var_job = {1}{0}var_jobType = {2}{0}var_jobname = {3}{0}var_content = {4}{0}var_contenticon = {5}{0}", 
       Environment.NewLine, 
       this.var_jobname, 
       this.jobType, 
       this.var_jobname, 
       this.var_content, 
       this.var_contenticon); 

     return foo; 
    } 

를 그리고, 당신은 당신이 할 수 있습니다 대기 전에 :

Console.WriteLine(job1);