2012-07-30 32 views
3

我創建了一個結構:如何顯示結構體的字段?

public struct User { 
    public string name; 
    public string email; 
    public string age; 
} 

然後創建一個:

User user = new User(); 
user.name = "Freewind"; 
user.email = "[email protected]"; 
user.age = 100; 

然後顯示它:

MessageBox.Show(user.ToString()); 

我希望它可以打印所有用戶結構的領域,但事實並非如此。它只是顯示:

MyApp.User 

是否有一種簡單的方法來顯示結構的所有字段?

回答

10

重寫ToString方法對你的結構:

public override string ToString() 
{ 
    return String.Format("name={0}, email={1}, age={2}", this.name, this.email, this.age); 
} 

請注意,這不是自動的,你就必須手動添加任何字段/屬性的字符串。

與反思,你可以做這樣的事情:通過所有屬性

public override string ToString() 
{ 
    Type type = this.GetType(); 
    FieldInfo[] fields = type.GetFields(); 
    PropertyInfo[] properties = type.GetProperties(); 
    User user = this; 

    Dictionary<string, object> values = new Dictionary<string, object>(); 
    Array.ForEach(fields, (field) => values.Add(field.Name, field.GetValue(user))); 
    Array.ForEach(properties, (property) => 
     { 
      if (property.CanRead) 
       values.Add(property.Name, property.GetValue(user, null)); 
     }); 

    return String.Join(", ", values); 
} 
+0

我們可以使用反射爲此創建一個通用的util嗎? – Freewind 2012-07-30 17:11:57

+1

如果您在結構名稱上有R#,alt + insert,請選擇「格式化成員」,這些代碼將自動爲您生成。 – 2012-07-30 17:14:03

+0

@Freewind使用反射添加片段。 – SomeWritesReserved 2012-07-30 17:23:22

0

使用反射和循環類似以下內容: VAR sourceProperties = typeof運算(用戶).GetProperties();

foreach (PropertyInfo sourceProperty in sourceProperties) 
    { 
    MessageBox.Show(sourceProperty.Name); 
    MessageBox.Show(sourceProperty.GetValue(user, null, null)); 
    } 

希望它有幫助。

+0

-1這會打開很多消息框! – 2012-07-30 17:14:30

+0

只是爲了演示你可以連接到一個字符串生成器並只顯示一個框。 – ASR 2012-07-30 17:15:33

+1

如果他只是想顯示值然後重寫ToString()是更好的解決方案 – ASR 2012-07-30 17:16:47

0

在初始化完所有你需要的結構之後,顯示一個結構的內容是很容易的,確保在你想要顯示的新的「用戶」對象中準確地指定什麼變量。這可以通過添加一個週期完成後,新的「用戶」對象的名字是這樣的:

MessageBox.Show(user.name); 

這將顯示「用戶」對象的名稱。通過用「email」或「age」替換「name」,可以輕鬆地使用任何其他用戶對象變量來完成此操作。順便說一下,將年齡(或任何數字)等內容存儲在「int」或「byte」中通常會更好,因爲這允許您將值更改得比在字符串中存儲數字容易得多。這裏有一個例子:

public struct User { 
    public string name; 
    public string email; 
    public int age; 
} 

or 

public struct User { 
    public string name; 
    public string email; 
    //use a byte to hold a value between 0 and 255 (most people don't live to be 255) 
    public byte age; 
} 

,並試圖顯示這個變量時,只需使用「的ToString()」後的變量名是這樣的:

MessageBox.Show(user.age.ToString()); 

這將int或字節轉換爲字符串,以便它可以在「MessageBox.Show」方法中使用。希望這有助於!

編輯: 還試圖顯示結構內的所有變量時,只是這樣做:

MessageBox.Show("Name: " + user.name + Environment.NewLine + "Email: " + user.email + Environment.NewLine + "Age: " + user.age + Environment.NewLine); 

這將顯示:

Name: FreeWind 
Email: [email protected] 
Age: 100 

內消息框。