通過c 反射初始化系統

2021-09-20 06:14:22 字數 3008 閱讀 3839

在專案中,特別是ui系統,經常需要做乙個ui系統的管理和ui系統初始化,以及ui系統銷毀等情況。

一般有兩種方式來管理ui系統

1.每加乙個系統就在uimanager中加乙個引用。

比如(偽**)

uimanager

uis.add(asystemclass)

類似這樣做,然後用uis來統一管理ui

優點:這樣寫很直觀,在乙個ui系統做完,可以自己管理ui系統初始化順序

缺點:每加乙個系統都需要在這裡修改**,對於開發者的維護成本比較高

2.用c#反射自動獲取相關的類來管理

首先我們會有乙個獲取屬性的基類

public class attributehandler}}

/// /// 註冊訊息處理

///

///

///

protected void registermsghandler(int cmdid, type handler)

", cmdid));

return;

}type pt = new type[0];

object pv = ;

//通過型別陣列獲取對應的型別的構造器

constructorinfo con = handler.getconstructor(pt);

t coninfo = (t)(con.invoke(pv));

"cmdid add : " + cmdid);

mmsghandlers.add(cmdid, coninfo);

}}

當然我們有乙個classenumerator是方便我們列舉出我們所有相關的類的

public class classenumerator

} private type attributetype;

private type inte***cetype;

public classenumerator(

type inattributetype,

type ininte***cetype,

assembly inassembly,

bool bignoreabstract = true,

bool binheritattribute = false,

bool bshouldcrossassembly = false)}

}else

}catch (exception e)

}protected void checkinassembly(

assembly inassembly,

bool binignoreabstract,

bool bininheritattribute

)// debug.log("found type:" + t.fullname + " : " + a.getname());}}

}}}}

}

然後我們可以有乙個uimanager來初始化反射後的資料

public class scenemanager : attributehandler

protected basescene reflectionscene(escenename epaneltype, ref scenehandlerattribute attribute)

}

其中basescene就是我們的ui系統基類

其中reflectionscene方法是用於獲取當前的ui系統的。這其中有乙個沒有說的列舉是escenename ,這裡列舉出來的是所有ui系統。

類似這樣

public enum escenename

然後我需要既然有需要反射的class,那麼我們就需要定義我們的反射屬性才行,也就是上面的scenehandlerattribute

public class handlerattribute :

attribute,

iidentifierattribute }

public handlerattribute(int inmessageid)

}public class scenehandlerattribute :

handlerattribute,

iidentifierattribute }

public string componentname }

public scenehandlerattribute(int inmessageid, string packageurl, string componentname):base(inmessageid)

}

這樣反射才知道要拿什麼還有怎麼從其他class重反射相關引數過管理類來。

最後就是我們真正需要用ui系統反射的地方

[scenehandlerattribute((int)scenedata.escenename.mainscene, "homepackage", "main")]

public class mainscene : basescene

類似這樣,就會把該類放入uimanager中管理以及傳入引數

mmessageid = scenedata.escenename.mainscene;

mpackageurl = 「homepackage」;

mcomponentname = 「main」;

優點:我們不需要手動加**到uimanager了,管理成本低了很多。uimanager統一管理,需要加[scenehandlerattribute((int)scenedata.escenename.mainscene, "homepackage", "main")]這樣的頭部就好了

缺點:1.沒有順序,順序完全是按照dll獲取到的class順序走的,所以ui系統中在初始化時不能有順序依賴。

2.在初始化的時候因為要反射所有類,所以會有乙個搜尋過程,同乙個工程中的類越多就搜尋越久。

C 直接初始化和複製初始化

在c 裡,物件初始化是乙個非常重要但又容易令人混淆的問題。這裡是自己的一些總結。一。初始化與賦值的含義 初始化 包括建立 或說定義 物件並且賦給初值。如果乙個物件只被建立而沒有被初始化,則該變數只能用於被賦值 賦值 擦除物件的當前值並用新值代替。二。內建型別 一 直接初始化 1.空初始化 即無引數無...

c 直接初始化與拷貝初始化

我們常見的幾種初始化的形式 string str1 first 拷貝初始化,編譯器允許把這句話改寫為string str first 但是string類必須有public的拷貝 移動 建構函式 string str2 10,a 直接初始化 string str3 str2 直接初始化 string ...

初始化 指定初始化

id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...