用程序来列举项目资源
为了让全项目的资源能够有效的被运用,不可能不了解建立与存取项目资源的方法。除了使用资源编辑器之外,我们也可以在应用程序中透过程序代码来存取项目资源,虽然使用Resources对象能够非常容易去存取特定的项目资源,但是如果我们希望在应用程序中透过程序代码来列举项目资源的话,该怎么做呢?
要想透过程序代码来枚举项目资源,必须使用System.Resources命名空间中的ResourceReader类。一般的作法是,先使用指定的项目资源文件来创建一个ResourceReader对象,接着调用ResourceReader对象的GetEnumerator方法来取得其枚举操作符,然后再通过一个循环去调用列举子的MoveNext方法即可取得各个项目资源。
图 1-1
图1-2 资源阅读器
图1-3资源阅读器
图1-4资源阅读器
图1-5 资源阅读器
程序范例:
程序范例DemoForm001.cs示范如何创建一个资源阅读器来让您产看项目文件中的所有资源。首先,您必须如图1-1所示去打开一个资源文件(.resources),接下来会将该资源文件中的所有资源列示于DataGridView控件中,每一项资源的名称、类型、与值都一览无遗。您可以如图1-2~1-5所示,从中选取所要阅读的资源,该项资源的资源名称、资源类型、资源值、以及字节会完整列示于画面的右侧。
程序范例DemoForm001.cs的设计技巧重点说明如下:
public struct Resource
{
private object ValueData;
private string TypeValue;
private string NameValue;
private byte[] BytesValue;
public object Value
{
get
{
return ValueData;
}
}
...
public Resource(
string Name, string type, object value, byte[] bytes)
{
NameValue = Name;
TypeValue = type;
ValueData = value;
BytesValue = bytes;
}
}
如下所示,声明一个类级别的泛型集合类Dictionary类型的变量:
private Dictionary<string, Resource> resources;
第一个类型参数string代表资源的名称,第二个类型参数Resource代表含有每一个资源相关信息的Resource结构。
替菜单项目“打开资源文件”的Click事件处理函数撰写下列程序代码,以便根据用户所选取的资源文件来创建一个ResourceReader对象,接着调用ResourceReader对象的GetEnumerator方法来取得其枚举操作符,然后再通过一个循环去调用枚举操作符的MoveNext方法即可取得各个项目资源。我们会在循环中调用GetResourceData方法来取得资源的类型与二进制信息,然后将我们所读取的每一个资源新增至resource这一个Dictionary对象中,以便稍后能够访问它:
private void openToolStripMenuItem_Click(
object sender, EventArgs e)
{
...
// 创建一个 Dictionary 对象。
resources = new Dictionary<string, Resource>();
...
try
{
// 根据用户所选取的资源文件来创建
// 一个 ResourceReader 对象。
using(ResourceReader myReader =
new ResourceReader(myFileName))
{
// 取得 ResourceReader 对象的枚举操作符
// 以便循览项目资源。
IDictionaryEnumerator ReaderWalker =
myReader.GetEnumerator();
// 读取资源。
while(ReaderWalker.MoveNext())
{
// 枚举操作符的索引键就是资源名称。
ResourceName = ReaderWalker.Key.ToString();
// GetResourceData 被用来取得资源的
// 类型与二进制信息。
myReader.GetResourceData(
ResourceName, out ResourceType,
out ResourceBytes);
// 如果可以的话,我们将直接读取资源的值。
try
{
ResourceValue = ReaderWalker.Value;
}
catch(FileNotFoundException)
{
ResourceValue = "无法解析的类型:" + ResourceType;
}
catch(TypeLoadException)
{
ResourceValue = "无法解析的类型:" + ResourceType;
}
...
// 将我们所读取的每一个资源新增
// 至 resources 这一个 Dictionary 对象中,
// 以便稍后能够访问它。
resources.Add(ResourceName,
new Resource(ResourceName, ResourceType,
ResourceValue, ResourceBytes));
...
// 将信息新增至 DataGridView 中。
gridResources.Rows.Add(
new object[]{ResourceName, ShortType(
ResourceType), shortVal});
}
}
}
...
}
当用户于DataGridView控件中选取某一个资源时,就会将该资源的名称、型别、值、以及字节显示在右侧的各个控件中。