Unity C# 使用反射,利用字符串作爲泛型參數調用泛型方法。

自己寫了一個UGUI管理器,最近新加入了一個功能,通過頁面的字符串索引,在載入時自動打開一些頁面。由於我的方法是這樣定義的。

 public T OpenDialog<T>(string page_name,string extra_index = "") where T : UGUIWidget

於是出現了一點點小小的悲劇。

只提供name的,不提供Class的話,是沒法調用泛型方法的。

順便,我的UGUI頁面配置文件是這樣定義的。

    [System.Serializable]
    public class UGUIPageData 
    {
        public string name_index;
        public string type_index;
        public string prefab_path;
    }

於是思考,能否利用反射,通過name_index找到type_index,然後獲得具體Page的type,同過反射調用泛型方法,實質上,確實是可行的。具體如下

            foreach (var page in auto_load_pages) 
            {
                UGUIPageData pd = ugui_configs.FindPageWithNameNoTypeCheck(page);
                MethodInfo mi = typeof(UGUIManager).GetMethod("OpenDialog").MakeGenericMethod(System.Type.GetType(pd.type_index));
                mi.Invoke(this, new object[] { pd.name_index,"" });
            }

本質上,是通過MakeGenericMethod方法,將type轉換爲泛型參數,然後通過反射直接調用OpenDialog。

這裏需要注意一下,通過反射調用泛型方法時,參數new object[] 是不支持默認參數的,必須把“”作爲參數傳進去,不然會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章