注意:
這是另一篇文章“.NET(C#):淺談資訊清單資源和RESX資源”的一部分。
所有提及類均在:System.Resources命名空間內。
來看這三個類的常用成員:
interface IResourceWriter: IDisposable
void AddResource(string name, object/string/byte[]);
//添加資源資料
void Generate();
//更新緩衝區(Flush)
void Close();
//調用Dispose
interface IResourceReader: IDisposable, IEnumerable
IDictionaryEnumerator GetEnumerator();
//擷取字典迭代器(用來枚舉資源)
void Close();
//調用Dispose
class ResourceSet: IDisposable, IEnumerable
//沒有CultureInfo支援,封裝一個IResourceReader
建構函式(Stream/IResourceReader/string);
Type GetDefaultReader/Writer();
//返回預設IResourceReader/Writer類型
IDictionaryEnumerator GetEnumerator();
//等效於IResourceReader.GetEnumerator
object GetObject(string);
string GetString(string);
//有bool參數:指定否是不區分大小寫
//返回資源中指定名稱的資料
有兩個類繼承IResourceReader,分別是ResourceReader和ResxResourceReader。
IResourceWriter則為ResourceWriter和ResxResourceWriter。
ResourceReader和ResourceWriter操作的是二進位的資源檔,以.resources為副檔名。
ResxResourceReader和ResxResourceWriter操作的是XML格式的RESX檔案(注意RESX在編譯後也用到.resources檔案)
這些類的建構函式可以指定字串表示檔案路徑或者Stream對象。
最後ResxResourceReader/Writer類型在System.Windows.Forms.dll類庫中。而ResourceReader/Writer在mscorlib.dll類庫中。
下面代碼,使用IResourceWriter來寫一個資源檔(用ResourceWriter類型,所以是.resources檔案),然後用IResourceReader和ResourceSet來讀取資源檔:
//+ using System.Resources
class Program
{
static void Main()
{
//使用IResourceWriter
Write();
//使用IResourceReader
ReadUsingResourceReader();
//使用ResourceSet
ReadUsingResourceSet();
}
//使用IResourceWriter
static void Write()
{
using (IResourceWriter rw = new ResourceWriter("a.resources"))
{
rw.AddResource("byte", 0xff);
rw.AddResource("文本", "hellow");
rw.AddResource("guid", Guid.NewGuid());
}
}
//使用IResourceReader
static void ReadUsingResourceReader()
{
Console.WriteLine("== 使用IResourceReader");
using (IResourceReader rr = new ResourceReader("a.resources"))
{
var iter = rr.GetEnumerator();
while (iter.MoveNext())
Console.WriteLine("鍵: {0} 值: {1}", iter.Key, iter.Value);
}
}
//使用ResourceSet
static void ReadUsingResourceSet()
{
Console.WriteLine("== 使用ResourceSet");
using (ResourceSet rs = new ResourceSet("a.resources"))
{
Console.WriteLine(rs.GetObject("byte"));
Console.WriteLine(rs.GetString("文本"));
Console.WriteLine(rs.GetObject("guid"));
}
}
}
輸出:
== 使用IResourceReader
鍵: 文本 值: hellow
鍵: guid 值: 7f958dc9-eae2-43f5-a150-88fd8a07374e
鍵: byte 值: 255
== 使用ResourceSet
255
hellow
7f958dc9-eae2-43f5-a150-88fd8a07374e
.NET還提供一個ResourceManager類型來提供支援多語言的資源提取,原理是通過探索.NET中的附屬組件(satellite assembly),關於ResourceManager的使用,可以參考這篇文章:.NET(C#):使用ResourceManager類型.