[C# 速記] 使用 For 迴圈讀取 Class 下的所有物件 (非陣列也能讀)

如果想要在 Class 下存放多筆相同類型的物件時常會使用陣列來達成,但在有些不方便使用陣列的地方時該怎麼辦呢?今天要筆記的是 System.Type 的應用,他可以讓 Class 變得像陣列一樣,可以用簡單的迴圈將所有資料取出。

這裡有一個名為 Window 的類別。如你所見,下面存放了五個公開的 GameObject 物件,而我們的目的是用 For 迴圈來將這裡的物件們取出。

public class Window
{
    public GameObject character;
    public GameObject inventory;
    public GameObject quest;
    public GameObject achievement;
    public GameObject setting;
}

用法 Usage

一開始,我們必須先有一個實體化的 Window 物件。

Window window = new Window();

為求方便,這裡就先假設 Window 下的五個 GameObject 皆已存有資料,我們要將他們一次取出使用。


接下來開始準備讀取資料,我們必須先宣告一個 Type 並用 typeof 取出 Window 的 Type。

Type type = typeof(Window); 

擁有 Window 的 Type 後,再宣告一個 FieldInfo 陣列來存放用 GetFields 取出的欄位資訊。(這時的 fieldInfos 中僅記錄著 Class 下的公開欄位架構,並不包含值)。

如果叫不出 FieldInfo 的話,請確保你有成功 Using System.Reflection 命名空間。

FieldInfo[] fieldInfos = type.GetFields();

最後用 For 迴圈搭配 GetValue 即可帶出 Window 下的所有欄位內容。

這裡要注意兩件事情:

  1. GetValue 取出的資料是 object 而不是原始的 GameObject,必須手動將他轉回來。
  2. GetValue 內要帶入的參數是最前面我們實體化、存有五個 GameObject 的 Window 物件,並不是其他奇怪的東西。
for(int i = 0; i < fieldInfos.Length; i++)
{
    GameObject gameObject = (GameObject)fieldInfos[i].GetValue(window);
    // TODO
}

這樣子就可以輕鬆的讀取物件下的資料了,當初為了要實現這個看了一堆文章都看不懂呢……

程式範例 Example

using System;
using System.Reflection;
using UnityEngine;

public class WindowProperty : MonoBehaviour
{
    public Window window;

    [Serializable]
    public class Window
    {
        public GameObject character;
        public GameObject inventory;
        public GameObject quest;
        public GameObject achievement;
        public GameObject setting;
    }

    private void Start()
    {
        Type type = typeof(Window);
        FieldInfo[] fieldInfos = type.GetFields();
        for (int i = 0; i < fieldInfos.Length; i++)
        {
            GameObject gameObject = (GameObject)fieldInfos[i].GetValue(window);
            Debug.Log(gameObject.transform.position);
        }
    }
}

參考資料 Reference

訂閱
Notify of
guest
0 留言
Inline Feedbacks
檢視所有留言