对于C#4.0中极其昂贵的Enum.IsDefined()有什么替代方案?

时间:2012-07-27 07:32:39

标签: c#-4.0 enums

我需要多次对我的数据执行此操作:

public void AddBehavior(BehaviorTypes type)
{
    if (Enum.IsDefined(typeof(BehaviorTypes), type))
    {
    switch (type)
    {
        case BehaviorTypes.render:
            return new renderable();
        break;   
    }
}

这是两个显式函数调用和一个对象装箱/拆箱操作!这个操作太昂贵了,只是为了检查一个枚举。有谁知道更便宜的替代品?

2 个答案:

答案 0 :(得分:0)

您可以使用Enum.GetValues在优化集合中,在静态成员中,一劳永逸地提取枚举类型的所有现有值。而且您只需要在下一个搜索该集合。

我猜最快,如果只考虑一个枚举,就会出现一系列布尔值,告诉你你的积分是否存在于枚举中。除了这个数组的构造(成本一次)之外,你有一个enum到int的转换,以及一个数组中的读访问(如果我没弄错的话,这是你能得到的最快的吗?)

答案 1 :(得分:0)

关于 .NET 的一个鲜为人知的事实是您可以在枚举上声明扩展方法。避免拳击将是一个很好的理由。为了维护,您可以在与枚举相同的文件中定义静态方法,以便您知道同时更改它们。

public enum BehaviorTypes
{
    Render,
    Foo,
    Bar
}

public static class BehaviorTypesExtensions
{
    public static bool IsDefined(this BehaviorTypes behaviorTypes)
    {
        return behaviorTypes >= BehaviorTypes.Render && behaviorTypes <= BehaviorTypes.Bar;
    }
}

用法

class Program
{
    static void Main(string[] args)
    {
        foreach (BehaviorTypes value in Enum.GetValues(typeof(BehaviorTypes)))
        {
            Console.WriteLine($"{value} is defined: {value.IsDefined()}");
        }

        Console.WriteLine($"43 is defined: {((BehaviorTypes)43).IsDefined()}");

        // Render is defined: True
        // Foo is defined: True
        // Bar is defined: True
        // 43 is defined: False
    }
}