C# - 创建 EnumRandomizer 类

标签 c# class random enums

我对如何正确执行此操作感到困惑。我找到了 this我不确定这是否是重复的。

我将从头开始。我能够通过创建一个专门用于随机化该枚举的类来实现我发布的线程中给出的建议,如下所示:

public class Foo
{
    public static Random rand = new Random();
    public static FooEnum[] values;
    public static FooEnum GetRandomFoo()
    {
       values = (FooEnum[]) Enum.GetValues(typeof(FooEnum));
       return values[rand.Next(0, Values.Length)];      
    }

    public enum FooEnum { A, B, C}
}

这很有效。唯一的问题是它显然导致我在我的枚举上包装了一个类,因此总是要求我想出两种不同的方式来表达同一件事(例如,类性别包装在枚举性上;类武器包装在枚举武器类型上,等等) .);

这也是低效的,因为它需要我编写代​​码,而这些代码必须为同一件事一遍又一遍地重新实现。因此,显而易见的解决方案是创建一个随机枚举类,它可以采用任何类型的枚举类型并使用以下方法将其随机化。

有没有人知道如何做到这一点?我的方法不太奏效:

public class EnumRandomizer 
    {

    private Random rand;
    private Type[] values;
    private int randomizerId;

    private static int randomizerCount = 0;

    public EnumRandomizer ()
    {
        rand = new Random();
        randomizerId = randomizerCount;
        randomizerCount++;

    }

    public Type RandomEnum(Type type)
    {
        values = (Type[]) Enum.GetValues(type);

        return values[rand.Next(0, values.Length)];
    }
}

有人要吗?

最佳答案

public class EnumRandomizer
{
    public static Random rand = new Random();

    public static T GetRandomValue<T>()
    {
        T[] values = (T[])(Enum.GetValues(typeof(T)));
        return values[rand.Next(0, values.Length)];
    }
}

用法:

public class Main
{
    public enum FooEnum { A, B, C }

    public static void Main(string[] args)
    {
        // Note that since the method does not take an argument which
        // specifies the generic type, you must provide it explicitly.
        FooEnum randomFoo = EnumRandomizer.GetRandomValue<FooEnum>();
    }
}

至于为什么你的原件不起作用:真正解决的是 System.Type类,而不是您传入的类型。泛型允许您以尝试的方式动态分配类型。这就是类型安全操作需要它们的原因。

关于C# - 创建 EnumRandomizer 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932491/

相关文章:

c++ - 这在 C++ 中可能吗?

c++ - 未正确考虑 Makefile 中的依赖项

使用 system.io 的 C# 在我的类(class)中不起作用,但在 main 中起作用

c# - for循环中的随机迭代

Python:在井字游戏板上随机选择一个点

c# - 将 C# 命令行应用程序转换为 Windows 服务

c# - 如何递归查找子属性属性

java - RandomStringUtils.randomAlphanumeric 保证数字和字母

c# - 如何在 Windows 服务中运行长时间运行的进程?

c# - 算法优化 - C#