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)];
}
}
人吗?
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));
希望能有所帮助