代码之家  ›  专栏  ›  技术社区  ›  Fitzchak Yitzchaki

创建枚举扩展帮助程序的帮助

  •  3
  • Fitzchak Yitzchaki  · 技术社区  · 14 年前

    以这个枚举为例:

    public enum PersonName : short
    {
        Mike = 1,
        Robert= 2
    }
    

    我想有这样的扩展方法:

    PersonName person = PersonName.Robert;
    short personId = person.GetId();
    //Instead of:
    short personId = (short)person;
    

    知道如何实现这个吗?

    它必须是int、short等的泛型,以及泛型枚举,而不限于人名。

    5 回复  |  直到 11 年前
        1
  •  2
  •   Community Mofi    7 年前

    这是完全不可能的。

    不能基于 enum 的基础类型。

    说明:

    您可以尝试以下方法:

    public static TNumber GetId<TEnum, TNumber>(this TEnum val) 
           where TEnum : Enum 
           where TEnum based on TNumber
    

    第一个约束是 unfortunately not allowed by C# 和第二个约束不受CLR支持。

        2
  •  2
  •   nawfal Donny V.    11 年前

    好吧,这是可能的,但反过来,您必须指定底层类型是什么:

    public static T GetId<T>(this Enum value) 
                            where T : struct, IComparable, IFormattable, IConvertible
    {
        return (T)Convert.ChangeType(value, typeof(T));
    }
    

    自从 System.Enum 是所有枚举类型的基类。称之为:

    PersonName person = PersonName.Robert;
    short personId = person.GetId<short>();
    

    因为你可以把任何东西 long 你甚至可以得到:

    public static long GetId(this Enum value)
    {
        return Convert.ToInt64(value);
    }
    

    并致电:

    PersonName person = PersonName.Robert;
    long personId = person.GetId();
    

    否则有可能得到 object 实例返回,如下所示:

    public static object GetId(this Enum value)
    {
        return Convert.ChangeType(task, Enum.GetUnderlyingType(value.GetType()));
    }
    
    PersonName person = PersonName.Robert;
    var personId = (short)person.GetId(); 
    // but that sort of defeats the purpose isnt it?
    

    所有这些都涉及到某种拳击和拆箱。第二种方法看起来更好(你甚至可以做到 int ,标准类型),然后是第一个。

        3
  •  0
  •   Zach Johnson    14 年前

    你有什么理由不能把它变成一门课吗?在类的上下文中,它可能更有意义。

        4
  •  0
  •   Perpetualcoder    14 年前

    我只想用像 IEnumerable<KeyValuePair<string,short>> Dictionary<string,short> …如果需要,可以将扩展添加到IDictionary或IEnumerable。

        5
  •  0
  •   Josh Crozier HBP    11 年前

    我相信您应该能够在 PersonName 班级:

    public static class PersonExtensions // now that sounds weird...
    {
        public static short GetID (this PersonName name)
        {
            return (short) name;
        }
    }
    

    side node:我希望您问题中的代码过于简化,因为将人员存储库作为枚举实现似乎不太正确:)