我說的不是解決方案的資源系統,而是系統。ResourceReader和Writer。雖然它們沒有ResourceManager那樣豐富的支持,但是光是枚舉接口就足夠妳用了。
我花了壹些時間直接給妳寫了壹個輔助靜態類(ResPacker)。已經調試完畢,註釋完整。拿走用。
使用?系統;
使用?系統。收藏;
使用?系統。集合。泛型;
使用?系統。資源;
使用?系統。木衛壹;
使用?系統。繪圖;
命名空間?控制臺應用程序3
{
班級?程序
{
//寫在前面:
//1.這個輔助類可以幫助妳把任意數量的任意對象塞進壹個文件,也可以壹次把它們拿出來。
//2.我趕時間。我沒寫try.catch,我自己補。
//3.不建議將不同類型的對象打包到壹個文件中。用Image的話都有Image,用string的話都有string,以免拿出來後判斷類型。
//4.我沒有寫增刪,因為打包的資源文件本質上是壹個連續的字節流,從中間刪除壹個文件太麻煩了。
//5.添加操作可以通過使用非覆蓋模式的打包方法(稍後解釋)強制追加。
//6.刪除操作建議讀取所有資源,刪除不需要的,然後壹次性覆蓋寫入。
//7.再次,。NET永遠不會允許資源名稱具有相同的名稱或數字前綴。號碼前綴的問題我處理過了,重名的問題我自己處理。最好先把它作為主鍵扔進字典再放進去。
//8.我沒有檢查文件占用情況,所以請避免在打包時拆包。
//9.這是壹個靜態類。請為客戶的添加、刪除和修改小工具程序復制此類。
//999.感謝您的觀看!隨意使用代碼!如果妳有麻煩,打電話給我!
靜電?作廢?Main(string[]?參數)
{
//包裝
字典& lt弦,?object & gt?dicToPack?=?新的?字典& lt弦,?object & gt();
字典包。Add("key1 ",形象。from file(@ " c:\ Users \櫻井真子\ Pictures \ 1 . jpg));
字典包。添加(" key2 ",“餵?世界”);
重新打包。包(dicToPack);
//解包
字典& lt字符串,對象& gt?dicRcv=?重新打包。GetAllResources();
控制臺。WriteLine((string)dicr cv[" key 2 "]);
控制臺。WriteLine(dicRcv["key1"]。GetType()。全名);
控制臺。read key();
}
}
公共?靜電?班級?重新打包
{
///?& lt總結& gt
///?將任意對象批量打包到資源文件中。
///?& lt/summary & gt;
///?& ltparam?name="objCollection " >打包對象的列表。鍵值對中的鍵是它在資源文件中的唯壹名稱。& lt/param & gt;
///?& ltparam?name = " targetFilePath " & gt目標資源文件。默認參數是當前目錄中的“MyRes.pck”文件。& lt/param & gt;
///?& ltparam?name = " overwrite " & gt是否覆蓋現有的目標文件。默認值=真
公共?靜電?作廢?pack(IDictionary & lt;字符串,對象& gt?對象集合,?字符串?targetFilePath?=?“MyRes.pck”,?布爾?覆蓋?=?真實)
{
如果?(覆蓋)
文件。delete(target file path);
使用?(ResourceWriter?rw?=?新的?ResourceWriter(targetFilePath))
{
foreach?(KeyValuePair & lt弦,?object & gt?配對?在?對象集合)
//為了防止傳入的資源名稱以數字開頭,資源名稱以_
rw。AddResource("_ "?+?壹對。關鍵,?壹對。值);
rw。generate();
rw。close();
}
}
///?& lt總結& gt
///?解包資源文件並返回所有資源及其資源名。
///?& lt/summary & gt;
///?& ltparam?name = " targetFilePath " & gt要解包的資源文件。默認為當前目錄中的“myres . PCK ”
///?& ltreturns & gt資源字典中,鍵值是資源的唯壹標識名。如果沒有資源,則返回壹個空集合。& lt/returns & gt;
公共?靜電?字典& lt字符串,對象& gt?GetAllResources(字符串?targetFilePath?=?" MyRes.pck ")
{
字典& lt弦,?object & gt?rtn?=?新的?字典& lt字符串,?object & gt();
使用?(ResourceReader?rr?=?新的?ResourceReader(targetFilePath))
{
foreach?(DictionaryEntry?入門?在?rr)
rtn。添加(((字符串)條目。關鍵)。子串(1),?入口。值);
}
回歸?rtn
}
///?& lt總結& gt
///?根據資源名稱從指定的資源文件中檢索資源。
///?& lt/summary & gt;
///?& ltparam?name = " resName " & gt資源名稱
///?& ltparam?name = " targetFilePath " & gt要檢索的資源的文件名,默認為“myres.pck”
///?& ltreturns & gt與資源名稱對應的資源
公共?靜電?對象?SearchResource(字符串?resName,string?targetFilePath="MyRes.pck ")
{
對象?rtn = null
使用?(ResourceReader?rr?=?新的?ResourceReader(targetFilePath))
{
foreach(DictionaryEntry?入門?在?rr)
如果?((字符串)條目。鑰匙?==?'_'?+?resName)
{
rtn?=?入口。價值;
打破;
}
}
回歸?rtn
}
}
}
對了,如果妳想混合不同類型的對象拿出來不知道是什麽類型,請用GetType看看;
使用以上三種方法時,不用擔心下劃線,寫和讀都做到了;
資源名限制相對寬松,鏡像文件可以直接使用其完整路徑作為資源名。