2013-06-21 58 views
3

要開始,我寧願不使用反射來完成此操作。打印C類中的所有變量#

我有一個類可以說

public class exampleClass 
{ 
    public string var1 = "one"; 
    public string var2 = "two"; 
    public int var3 = 3; 
    public string var4 = "four"; 
    etc. etc.. 
} 

我要動態地能夠通過這個類進行迭代並打印出變量。我想過序列化,但並不確定如何爲這種情況實現它(我能找到的唯一例子是XML,我不想這麼做),我也不想改變類中的結構任何方式。

的原因,我這樣做,是因爲我構建一個HTML表格和想做的事:

for(int i = 0; i < exampleClass.Count; i++) 
    tbl_row = "<td>" + exampleClass[i] + "</td>"; 

或類似的東西。有什麼建議麼?

+0

好奇:爲什麼厭惡'System.Reflection'? – DonBoitnott

+6

從技術上講,這些是字段,而不是變量,讀取它們的最簡單方法是使用反射 –

+0

試圖與項目的編碼實踐保持一致,並且反射不在其他地方使用。還寧願將參考文獻保持在最低限度。我也嘗試了反射,當我這樣做時得到一個空引用異常。我可以張貼,如果你想(但仍想看到替代) – eric

回答

2

easisets的方式將是使用反思。這應該是足夠了:

var example = new exampleClass(); 

var allPublicFields = example.GetType(). 
     GetFields(BindingFlags.Public | BindingFlags.Instance); 

使用字典,而不是字段:Dictionary<fieldName, fieldValue>,但是這是一種 超過工程簡單的一個streghtforward解決方案:反射在你的強類型類的清晰maintanable結構。

1

如果您不想使用反射,那麼如何將數據存儲在字典中而不是自定義類中?這樣,您可以根據需要遍歷鍵或值。

+0

違背了代碼的格式。這是一個視圖模型,並在其他地方使用,所以我不想破壞代碼來做到這一點。 – eric

1

對於使用TagBuilder構建HTML完全一樣。

var tagBuilder = new TagBuilder("tr"); 
var exampleClass = new exampleClass(); 

tagBuilder.InnerText += "<td>Field</td><td>Value</td>"; 

foreach(var field in typeof(exampleClass) 
         .GetFields(BindingFlags.Public | BindingFlags.Instance)) 
{ 
    var nameBuilder = new TagBuilder("td"); 
    var valueBuilder = new TagBuilder("td"); 

    nameBuilder.InnerHtml = field.Name; 
    valueBuilder.InnerHtml = field.GetValue(exampleClass).ToString(); 

    tagBuilder.InnerHtml += string.Format("{0}{1}", 
              nameBuilder.ToString(), 
              valueBuilder.ToString()); 
} 

輸出:

<tr> 
    <td>Field</td><td>Value</td> 
    <td>var1</td><td>one</td> 
    <td>var2</td><td>two</td> 
    <td>var3</td><td>3</td> 
    <td>var4</td><td>four</td> 
<tr> 
1

就個人而言,我覺得你有反射更好。如果您使用.NET 4或更高版本,並且從DynamicObject派生exampleClass,則可以實現要嘗試執行的操作。

example on this page與您所要做的非常相似。

+0

儘管使用DynamicObject當然是實現這種功能的一種方式,但值得注意的是,提問者並沒有聲明「我不是真的想要以任何方式改變類的結構」。我會假設更改哪些類的exampleClass繼承將違背此要求。 – Chris

+0

哎呀,我錯過了:)我的建議是學術,我不會推薦在這個實例中使用'DynamicObject'。 – dariom