.NET(C#):使用IResourceReader,IResourceWriter和ResourceSet获取资源文件

注意:

所有提及类均在: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的使用,

http://www.cnblogs.com/mgen/archive/2011/12/11/2283885.html.NET(C#):使用ResourceManager类型 

原文地址:https://www.cnblogs.com/yuhanzhong/p/2975460.html