首页 > 解决方案 > 通用枚举类型扩展方法的随机枚举值

问题描述

我想为任何从该枚举返回随机值的枚举编写扩展方法,目前我得到了这个:

class Monster
{
    public enum presets
    {
     //some values
    }
    presets p = presets.randomEnum();
}
public static class Extensions
{
        public static T randomEnum<T>(this T en) where T : struct , IConvertible , IEnumerable<Enum>
        {
            if (!typeof(T).IsEnum) { throw new Exception("random enum variable is not an enum"); }
            Array values = en.ToArray();
            return (T)values.GetValue(Random.Next(values.Length));
        }
}

但是当我做presets.randomEnum() Visual Studio 19 时告诉我 Error CS0117 'Monster.presets' does not contain a definition for 'randomEnum'

注意:我不得不为那个 ext 方法做很多谷歌搜索,所以如果有一个我错过或只是没有想到的更简单的方法,我非常感谢

标签: c#enumsextension-methods

解决方案


扩展方法必须定义在类的顶部(即在命名空间内但不在另一个类中)。此外,你不能对它有那个 IEnumerable 约束,它太多了。这对我有用:

 public enum Presets
    {
        Test,
        Test2
    }


    public static class Extensions
    {
        public static T RandomEnum<T>(this T en) where T : struct, IConvertible
        {
            if (!typeof(T).IsEnum) { throw new Exception("random enum variable is not an enum"); }

            var random = new Random();
            var values = Enum.GetValues(typeof(T));
            return (T)values.GetValue(random.Next(values.Length));
        }
    }

推荐阅读