编码不是枚举

本文关键字:枚举 编码 | 更新日期: 2023-09-27 18:33:08

我正在尝试找出一种方法将文件的编码存储在数据库中,然后能够将其检索回其原始类型(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());
        }
    }
}

我在解析行中得到的异常说:

Type provided must be an Enum.
Parameter name: enumType

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

编码不是枚举

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

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)获取编码。

错。右键单击,转到定义显示编码是这样定义的:

public abstract class Encoding : ICloneable

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

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

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

这可能不是存储不同编码数据的合理策略......但是,我不知道你在大局上到底要做什么。

Encoding是一个

类而不是枚举。调用Encoding.Unicode是调用公共属性。这一行是错误的:

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

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