簡體   English   中英

C# - 創建EnumRandomizer類

[英]C# - Creating a EnumRandomizer Class

關於如何正確地做這件事,我很難過。 我發現了這一點 ,並不確定這是否可能是重復的。

我會從頭開始。 我能夠通過創建一個專門用於隨機化枚舉的類來實現我發布的帖子中給出的建議,如下所示:

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

這非常有效。 唯一的問題是它顯然導致我在我的枚舉上包裝了一個類,因此總是要求我提出兩種不同的方式來說同樣的事情(例如,類包裝性別包含枚舉性別;類武器包裹枚舉武器類型等);

這也是低效的,因為它需要我編寫代​​碼,這些代碼必須反復重復實現同樣的事情。 因此,對此明顯的解決方案是創建一個Random 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));

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM