5

我试图找出一种方法将文件的编码存储在数据库中,然后能够将其检索回原始类型(System.Text.Encoding)。但我收到一个我不明白的错误。

作为测试,我创建了这个小程序来重现错误:

using System;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            object o = Encoding.Unicode;
            Encoding enc = (Encoding) Enum.Parse(typeof(Encoding), o.ToString());
        }
    }
}

我在 Parse 行中遇到的异常说:

Type provided must be an Enum.
Parameter name: enumType

那么,据我所知,基本上是告诉我typeof(Encoding)不返回 Enum 类型?提前感谢您提供的任何帮助。

4

4 回答 4

12

不,它不是枚举。它是一个具有静态属性的类。像这样的东西:

public class Encoding
{
    public static Encoding ASCII
    {
         get
         {
             //This is purely illustrative. It is not actually implemented like this
             return new ASCIIEncoding();
         }
    }
}

如果要将编码存储在数据库中,请存储代码页:

int codePage = SomeEncoding.CodePage;

并用于Encoding.GetEncoding(theCodePage)获取编码。

于 2012-05-04T17:19:48.600 回答
2

这是正确的。右键,go to definition 显示Encoding是这样定义的:

public abstract class Encoding : ICloneable
于 2012-05-04T17:20:28.117 回答
2

Encoding.Unicode并且Encoding.ASCII是类的静态只读属性Encoding。他们不是enum成员。

您可以改为将CodePage编码存储在数据库中,并使用以下方法检索它Encoding.GetEncoding

// store the encoding
WriteToDatabase(myEncoding.CodePage);

// retrieve the encoding used
Encoding encoding = Encoding.GetEncoding(/* value from the database */);

对于存储不同编码的数据,这可能不是一个合理的策略……但是,我不知道您在大局中要完成的工作。

于 2012-05-04T17:21:30.823 回答
1

Encoding是一个类而不是枚举。呼叫Encoding.Unicode是呼叫公共财产。这一行是错误的:

Encoding enc = (Encoding) Enum.Parse(typeof(Encoding), o.ToString()); 

如果您查看Enum.Parse您将看到第一个参数应该是 enumType 并且您传递的是完全不同的对象。

于 2012-05-04T17:20:37.993 回答