如何在没有装箱的情况下比较System.Enum和枚举(实现)?

Hat*_*ing 12 c# enums

我如何可以比较System.Enum一个enum没有拳击?例如,如何在不装箱的情况下使下面的代码工作enum

enum Color
{
    Red,
    Green,
    Blue
}

...

System.Enum myEnum = GetEnum(); // Returns a System.Enum. 
                                // May be a Color, may be some other enum type.

...

if (myEnum == Color.Red) // ERROR!
{
    DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

具体而言,此处的目的不是比较基础值.在这种情况下,基础值并不重要.相反,如果两个枚举具有相同的基础值,则如果它们是两种不同的枚举,则不应将它们视为相等:

enum Fruit
{
    Apple = 0,
    Banana = 1,
    Orange = 2
}

enum Vegetable
{
    Tomato = 0,
    Carrot = 1,
    Celery = 2
}

myEnum = Vegetable.Tomato;
if (myEnum != Fruit.Apple) // ERROR!
{
    // Code should reach this point 
    // even though they're the same underlying int values

    Log("Works!");
}
Run Code Online (Sandbox Code Playgroud)

这基本上和它的功能相同Enum.Equals(Object).不幸的是Equals()需要拳击枚举,在我们的例子中,这将是一个顽皮的事情.

有没有一种很好的方法来比较两个任意枚举没有拳击或以其他方式创建一堆开销?

谢谢你的帮助!

Luk*_*oid 5

这可以通过如下通用实现来完成:

private static bool Equals<TEnum>(Enum first, TEnum second)
    where TEnum : struct
{
    var asEnumType = first as TEnum?;
    return asEnumType != null && EqualityComparer<TEnum>.Default.Equals(asEnumType.Value, second);
}
Run Code Online (Sandbox Code Playgroud)

唯一堆分配的内存将是每个EqualityComparer<TEnum>.Default值的延迟实例化,但是对于每种类型的枚举,这只会发生一次.