c# - 通用枚举类型扩展方法的随机枚举值

标签 c# enums extension-methods

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

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 告诉我 错误 CS0117 'Monster.presets' 不包含 'randomEnum' 的定义

注意:我必须在谷歌上搜索该 ext 方法,所以如果有一个我错过或只是没有想到的更简单的方法,我非常感激

最佳答案

扩展方法必须定义在类的顶部(即在命名空间内部,但不能在另一个类中)。另外,你不能对它施加 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));
        }
    }

关于c# - 通用枚举类型扩展方法的随机枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64420140/

相关文章:

c# - 指定的参数超出了有效值的范围。参数名称 : site

c# - 没有通用扩展方法的类型推断

c# - 我怎样才能使这个扩展方法更通用?

c# - .NET 4.5 中的 HttpListener 无法将套接字识别为 WebSocket

c# - GridView 在 C# 中添加第二个和第三个标题行

C#网络应用程序用户无故注销

java - 基于枚举的组合框

Javascript - 从值中打印枚举的名称

java - java 如何确保每个 JVM 只有一个枚举实例

c# - 为什么我的程序不能确定对动态变量使用哪种扩展方法?