编码不是枚举类型吗?

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)不返回枚举类型?感谢您提供的任何帮助。


感谢大家的回答。我已经改成了这样:

`object o = Encoding.Unicode.CodePage; Encoding enc = Encoding.GetEncoding(int.Parse(o.ToString()));`
- Fran Casadome
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) 获取编码。


2

没错。右键,转到定义会显示Encoding的定义如下:

public abstract class Encoding : ICloneable

2

Encoding.UnicodeEncoding.ASCIIEncoding类的静态只读属性,它们不是enum成员。

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

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

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

这可能不是一种存储不同编码数据的可靠策略...但我不确切知道你在整体上想要实现什么。

谢谢,是的,我想到了那个方法。 - Fran Casadome

1

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

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

如果你看一下Enum.Parse,你会发现第一个参数应该是枚举类型(enumType),而你传递的是完全不同的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接