c# -创建一个EnumRandomizer类

本文关键字:一个 EnumRandomizer 创建 | 更新日期: 2023-09-27 18:04:38

我对如何正确地做到这一点感到困惑。我发现了这个,但我不确定这是否可能是一个副本。

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

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}
}

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

类武器包裹enum武器类型等);

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

有谁对如何做到这一点有任何想法?我的方法不太管用:

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)];
    }
}

人吗?

c# -创建一个EnumRandomizer类

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类,而不是你传入的类型。泛型允许您以尝试的方式动态地分配类型。

创建泛型方法

public static T GetRandomFoo<T>()
{
    Random rand = new Random();
    T[] values = (T[])Enum.GetValues(typeof(T));
    return values[rand.Next(0, values.Count)];
}

或者这是你的类的正确版本,不建议使用,因为它会导致装箱/拆箱

    public class EnumRandomizer
    {
        private Random rand;
        private IList values;
        private int randomizerId;
        private static int randomizerCount = 0;
        public EnumRandomizer()
        {
            rand = new Random();
            randomizerId = randomizerCount;
            randomizerCount++;
        }
        public object RandomEnum(Type type)
        {
            values = Enum.GetValues(type);
            return values[rand.Next(0, values.Count)];
        }
    }

你可以这样使用

   FooEnum f = (FooEnum)new EnumRandomizer().RandomEnum(typeof(FooEnum));

希望能有所帮助

相关文章: