2010-05-21 115 views
2

我想在這裏實現的是有點棘手。在繼續之前,先讓我簡要介紹一下背景。使用動態枚舉作爲方法的參數類型

我知道我們可以使用枚舉作爲類型的方法的參數。例如,我可以做這樣的事情(一個非常簡單的例子)

 
namespace Test 
{ 
    class DefineEnums 
    { 
     public enum MyEnum 
     { 
      value1 = 0, 
      value2 = 1 
     } 
    } 
    class UseEnums 
    { 
     public void UseDefinedEnums(DefineEnums.MyEnum _enum) 
     { 
      //Any code here. 
     } 

     public void Test() 
     { 
      // "value1" comes here with the intellisense. 
      UseDefinedEnums(DefineEnums.MyEnum.value1); 
     } 
    } 
} 

什麼,我需要做的是建立一個動態枚舉並用其作爲代替DefineEnums.MyEnum類型如上所述。

我嘗試了以下。 1.使用我從網上獲得的方法從字符串列表創建一個動態枚舉。並創建了一個我可以使用的靜態類。

 
using System; 
using System.Collections.Generic; 
using System.Reflection; 
using System.Reflection.Emit; 

namespace Test 
{ 
    public static class DynamicEnum 
    { 

     public static Enum finished; 
     static List<string> _lst = new List<string>(); 

     static DynamicEnum() 
     { 
      _lst.Add("value1"); 
      _lst.Add("value2"); 

      finished = CreateDynamicEnum(_lst); 
     } 

     public static Enum CreateDynamicEnum(List<string> _list) 
     { 
      // Get the current application domain for the current thread. 
      AppDomain currentDomain = AppDomain.CurrentDomain; 

      // Create a dynamic assembly in the current application domain, 
      // and allow it to be executed and saved to disk. 
      AssemblyName aName = new AssemblyName("TempAssembly"); 
      AssemblyBuilder ab = currentDomain.DefineDynamicAssembly(
       aName, AssemblyBuilderAccess.RunAndSave); 

      // Define a dynamic module in "TempAssembly" assembly. For a single- 
      // module assembly, the module has the same name as the assembly. 
      ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll"); 

      // Define a public enumeration with the name "Elevation" and an 
      // underlying type of Integer. 
      EnumBuilder eb = mb.DefineEnum("Elevation", TypeAttributes.Public, typeof(int)); 

      // Define two members, "High" and "Low". 
      //eb.DefineLiteral("Low", 0); 
      //eb.DefineLiteral("High", 1); 

      int i = 0; 
      foreach (string item in _list) 
      { 
       eb.DefineLiteral(item, i); 
       i++; 
      } 

      // Create the type and save the assembly. 
      return (Enum)Activator.CreateInstance(eb.CreateType()); 
      //ab.Save(aName.Name + ".dll"); 


     } 
    } 
} 
  • 使用類試過,但我無法找到上述定義的「成品」枚舉。即我不能做到以下幾點
  •  
         public static void TestDynEnum(Test.DynamicEnum.finished _finished) 
         { 
          // Do anything here with _finished. 
         } 
    

    我猜後已變得過於長,但我希望我已經說得很清楚。

    +0

    還有一個類似的問題:http://stackoverflow.com/questions/725043/dynamic-enum-in-c – 2010-05-21 08:24:32

    回答

    3

    您將不得不傳入一個對象,或者動態創建您的方法。

    我想問問爲什麼你不能只用這個int這個?好像你將不得不動態地創建很多代碼,只是爲了能夠將它作爲枚舉傳遞。

    +3

    同意。不要這樣做! – bobbymcr 2010-05-21 08:14:57

    +0

    我不能在這裏使用int,因爲我需要在intellisense中的值(「value1」和「value2」),我不能得到如果我使用int。此外,value1和value2是動態生成的,不能在靜態枚舉中進行硬編碼。我修改了我的帖子以合併相同的內容。 – samar 2010-05-21 08:41:45

    +0

    當您在運行時動態生成代碼時,您無法在intellisense中獲得該代碼。如果您正在預生成一個程序集,添加一個引用,那麼使用enum作爲參數類型的方法應該可以正常工作。 – 2010-05-21 09:46:56

    2

    當您動態創建枚舉時,它在運行代碼之前不存在。由於在編譯時不能使用該類型,因此不能指定該類型的參數。動態創建一個枚舉只在已經有一個方法需要某種類型的枚舉(但不是任何特定的枚舉類型)時纔有用,或者您也創建了動態使用該枚舉的代碼。

    你可以用enum實例做什麼基本上是獲得一個值的字符串表示形式,將一個字符串解析爲一個值,並獲得定義值的列表。用Dictionary<int, string>這樣的東西很容易完成。

    +0

    嗨Guffa我得到你想說的在這裏。我將創建一個字典,它將包含我想在任何開發人員嘗試使用我的方法時顯示的值。這裏只有1個問題。我在創建方法時如何在參數中使用此字典?請指教。 – samar 2010-05-21 09:14:22