2011-08-03 53 views
3

我很難以正確地做到這一點。我發現this,我不確定這是否可能是重複的。C# - 創建一個EnumRandomizer類

我會從頭開始。我能夠實現我張貼專門爲隨機該枚舉,看起來像下面創建一個類的線程給出的建議是:

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

這相當奏效。唯一的問題是,它顯然導致我在我的枚舉中包裝一個類,因此總是要求我提出兩種不同的方式來表達同一事物(例如,類Gender覆蓋enum Sex;類Weapon包裹enum WeaponType等);

這也是低效的,因爲它會要求我編寫必須一遍又一遍地重複實現的代碼。因此,明顯的解決方案是創建一個隨機枚舉類,它可以採用任何類型的枚舉類型並使用以下方法對其進行隨機化。

有沒有人有關於如何做到這一點的任何想法?我的方法不太合適:

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

任何接受者?

回答

4
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類,而不是類型是什麼讓你動態分配。輸入你正在嘗試的方式。這就是爲什麼他們需要進行類型安全操作。

+2

需要強制轉換Enum.GetValues的返回值 – heisenberg

+0

謝謝。你介意給我展示一個如何實現這種行爲的簡單例子嗎?我對泛型非常陌生,我不知道如何調用這種方法。 – zeboidlund

+0

@kekekela好的。將更新。 – jdmichal

2

讓泛型方法

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

或者這是你的類的正確版本不推薦使用,因爲它會導致boxing/unboxing

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

希望這會有所幫助

+0

爲什麼使泛型雖然?那麼它是如何工作的呢? – zeboidlund

+0

看到編輯過的帖子,你的類會導致取消裝箱的enums,這比通用慢,通用更清晰,不需要類型轉換 –