2012-01-03 24 views
2

我有一個名爲Job的對象,它內部有字符串,整數和枚舉作爲公共對象。然後將每個作業放入一個隊列中,並遍歷流程中的隊列。將容器對象中的所有公共對象(字符串/整數/枚舉)的值寫入控制檯

我想要做的是,當我出列每個作業時,我可以一般地遍歷每個作業並將公共對象名稱和值寫入控制檯。

我想出瞭如何編寫對象名稱到控制檯,我可以明顯寫入值,但問題是我不知道如何從Job對象獲取每個公共字符串/ int /枚舉。

我已經看了 C# object dumper ​​ 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

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(或另一種方法),從類中構建一個很好的輸出。當然,你必須保持這一點...... – 2012-01-03 17:34:13

+0

我想我逐漸通過在這裏看例子:http://msdn.microsoft.com/en-us/library/aa332475(v=vs.71 ).aspx當我得到它時,我會發布我的解決方案。 – cvocvo 2012-01-03 17:50:15

+2

爲什麼不能在你的''ToString'(http://msdn.microsoft.com/en-us/library/system.object.tostring.aspx)(或者用不同的名字寫一個類似的方法)工作類? – 2012-01-03 18:40:57

回答

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

這將轉儲到控制檯,但它應該是直着足以改變他們寫的任何流。

更新

如果你開始從物業得到NullReferenceException的不是一套,而不是在try...catch包裝它,你應該做的對來自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,但我只是處理,如下所示:void DumpProperties(Object dumpWhat) foreach(PropertyInfo prop in dumpWhat.GetType()。 GetProperties()) { try Console.WriteLine(「{0} = {1}」,prop.Name,prop.GetValue(dumpWhat,BindingFlags.GetProperty,null,null,null).ToString()) ; } 趕上(NullReferenceException異常) {} } } – cvocvo 2012-01-03 19:06:59

+0

@cvocvo - 處理一個清潔的方式是首先得到的GetValue對象,檢查它是否是空的,如果它不然後將其轉換到一個字符串。這是更清潔的唯一原因是因爲異常和異常處理是昂貴的。我將以我如何處理這種情況爲例來更新我的答案。 – 2012-01-03 19:14:03

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