0

我想将枚举作为 int 获取,但前提是它应用了初始化程序 - 这样我就知道该值是明确定义的,而不仅仅是默认值。这是因为我使用枚举来表示具有定义的 int 代码的映射。有没有办法用枚举做到这一点,或者我将不得不使用其他东西,比如字典?

这是一个示例 - 我有以下映射:

苹果 = 1,香蕉 = 2,梨 = 4,菠萝 = 7

我想确保如果枚举是

public enum Fruit
{
Apples,
Bananas,
Pears,
Pineapples
}

它不会尝试获取 int 值,因为枚举中的值 1 对应于香蕉,而不是苹果,就像它应该的那样。让我知道我是否需要更清楚。

更新:

我使用可为空的枚举来检查值是否已设置(或未知元素),但这不是我在这里要问的。我不认为我解释得很好,所以我会再试一次。

我希望能够得到一个我一无所知的枚举,获取底层的 int 然后用它做一些事情。我唯一关心的是枚举已初始化,因为它告诉我它上面定义了实际代码。我不介意它是否为空。这是我检查的事情之一。但如果它不为空,我想确保显式定义 int 代码。代码 0 是完全可以接受的——即使这意味着它是未定义的——只要这是原始映射指定的。

另一个更新:

我从Microsoft 文档中得到了“初始化”这个术语,我认为它会引起混淆。我的意思是一个枚举,它具有明确定义的底层整数的值。IE,

public enum MyEnum
{
One = 1,
Two = 2,
Three = 3
}

与没有的相反。IE,

public enum MyEnum
{
One,
Two,
Three
}

我认为这也引起了混淆,我将这些称为设置了默认值,这很容易与默认设置第一个元素的不可空枚举混淆。

我使用它的方式是我有一个方法,它使用反射来获取具有某些自定义属性的属性的值。出于我的目的,我只想从具有明确定义代码的枚举中获取值。否则我不能假设 int 值具有任何商业意义。

4

3 回答 3

1

在 IL 级别,枚举只是一个整数(除非它被装箱);你不能0从显式中区分隐式0。A Nullable<SomeType>(aka SomeType?) 可能是一个可行的想法。除此之外:你必须想出一些关于零与默认值的本地定义。

于 2013-04-02T20:58:40.320 回答
0

枚举实际上是下面的序数值类型,因此它们不能是null,并且不能应用类似的解决方案。

最佳解决方案是添加对应于值 0 的枚举条目。例如

public enum Fruit
{
    Unknown = 0,
    Apples,
    Bananas,
    Pears,
    Pineapples
}

Fruit someFruit;
if (someFruit == Fruit.Unknown)
    Console.WriteLine("fruit is not initialized");
else
    Console.WriteLine("fruit is initialized");

另一种解决方法是将值包装到 Nullable 中。这样,您将允许将变量设置为null.

public enum Fruit
{
    Apples,
    Bananas,
    Pears,
    Pineapples
}

Fruit? someFruit;
if (!someFruit.HasValue)
    Console.WriteLine("fruit is not initialized");
else
    Console.WriteLine("fruit is initialized");
于 2013-04-02T20:58:55.793 回答
0

(不可为空的)枚举值始终是有效整数。因此,可以获得枚举中任何常量都未使用的值:

Fruit myFruit = (Fruit)12345;    // Some random integer

反过来:你总是可以得到任何枚举的整数值,不管它的值是否被定义为常量。

Fruit myFruit = (Fruit)12345;
int myFruitInt = (int)myFruit;

因此,如果您想确保枚举的值是定义中定义的值之一enum,您可以使用Enum.IsDefined方法,如下所示:

Fruit myFruit;
bool isDefined;

myFruit = Fruit.Bananas;
isDefined = Enum.IsDefined(typeof(Fruit), myFruit); // true, Bananas

myFruit = (Fruit)1;
isDefined = Enum.IsDefined(typeof(Fruit), myFruit); // true, Bananas

myFruit = Fruit.Bananas | Fruit.Pineapples;
isDefined = Enum.IsDefined(typeof(Fruit), myFruit); // false

myFruit = (Fruit)12345;
isDefined = Enum.IsDefined(typeof(Fruit), myFruit); // false

当然,您可以Type在方法中放入 any,而不仅仅是typeof(Fruit).


你谈论初始化的枚举。哪有这回事。枚举可以有任何整数值。值类型(包括枚举)的默认值为 0。但完全有可能(甚至建议)存在一个值为 0 的枚举常量(通常命名为NoneUnknownDefault)。因此,以下内容在语义上完全相同

private Fruit myFruit;

private Fruit myFruit = (Fruit)0;

private Fruit myFruit = Fruit.Unknown;

您无法在运行时分辨出区别,因为没有区别。


enum显然,关于状态的 MSDN 文档:

默认情况下,第一个枚举器的值为 0,之后每个枚举器的值都增加 1。例如,在以下枚举中,Sat 为 0,Sun 为 1,Mon 为 2,以此类推。

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

枚举器可以使用初始化器来覆盖默认值,如下例所示。

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

在此枚举中,元素的序列被强制从 1 而不是 0 开始。但是,建议包含一个值为 0 的常量。

我不确定文档调用这些初始化程序的内容,因为没有初始化任何内容。它只是让你的生活更轻松的语法。您也可以指定等效项:

enum Days {Sat=1, Sun=2, Mon=3, Tue=4, Wed=5, Thu=6, Fri=7};

也许他们的意思1是编译器将从该初始值开始计数以将常量整数值分配给它后面的枚举常量。例如:

enum Days {Sat, Sun=2, Mon, Tue=10, Wed, Thu, Fri=11};

相当于:

enum Days {Sat=0, Sun=2, Mon=3, Tue=10, Wed=11, Thu=12, Fri=11};

同样,什么都没有初始化

于 2013-04-02T21:18:18.490 回答