动态更改C#中枚举的值?

时间:2011-10-19 10:47:53

标签: c# enums

我有一个枚举

    public enum TestType:int
   {
      Aphasia = 2,
      FocusedAphasia = 5
   }

设置值。我想将枚举'FocusedAphasia'的值从5更改为10.任何人都可以帮助我在运行时更改枚举的值

4 个答案:

答案 0 :(得分:10)

您无法在运行时更改枚举。我不确定你为什么需要,但无论如何都不可能。使用变量将是另一种选择。

答案 1 :(得分:6)

如果你愿意,你不能这样做,它是强类型值

枚举的元素是只读的,在运行时更改它们是不可能的,也不是理想的。

可能适合你的是枚举的扩展,以公开新值以用于新功能和诸如此类的东西,例如:

public enum TestType:int
{
    Aphasia = 2,
    FocusedAphasia = 5
    SomeOtherAphasia = 10
}

对于你想要做的事情并没有完全了解,我不能提出太多建议。

答案 2 :(得分:2)

实际上你可以。假设您有一个带有原始TestType的程序集(dll)。您可以卸载该程序集(这有点复杂),使用新的TestType重写程序集并重新加载它。

但是,您无法更改现有变量的类型,因为在卸载程序集之前必须先处理这些变量。

答案 3 :(得分:0)

嗯,在我写答案时,这个问题已经有7年了。我仍然想写它,也许以后会有用。

无法在运行时更改枚举值,但是有一种方法可以通过将int变量转换为enum,然后在字典中定义这些int及其值来实现,如下所示:

// Define enum TestType without values
enum TestType{}
// Define a dictionary for enum values
Dictionary<int,string> d = new Dictionary<int,string>();
void Main()
{
    int i = 5;
    TestType s = (TestType)i;
    TestType e = (TestType)2;

    // Definging enum int values with string values
    d.Add(2,"Aphasia");
    d.Add(5,"FocusedAphasia");

    // Results:
    Console.WriteLine(d[(int)s]); // Result: FocusedAphasia
    Console.WriteLine(d[(int)e]); // Result: Aphasia
}

这样,您就可以为枚举值创建一个动态字典,而其中没有任何内容。 如果您需要枚举的其他任何值,则可以创建一个方法来添加它:

public void NewEnumValue(int i, string v)
{
    try
    {
        string test = d[i];
        Console.WriteLine("This Key is already assigned with value: " + 
                           test);
    }
    catch
    {
        d.Add(i,v);
    }
}

因此,您最后使用的代码应该是这样的:

// Define enum TestType without values
enum TestType{}
// Define a dictionary for enum values
Dictionary<int,string> d = new Dictionary<int,string>();

public void NewEnumValue(int i, string v)
{
    try
    {
        string test = d[i];
        Console.WriteLine("This Key is already assigned with value: " + 
                           test);
    }
    catch
    {
        d.Add(i,v);
        Console.WriteLine("Addition Done!");
    }
}

void Main()
{
    int i = 5;
    TestType s = (TestType)i;
    TestType e = (TestType)2;

    // Definging enum int values with string values

    NewEnumValue(2,"Aphasia");
    NewEnumValue(5,"FocusedAphasia");
    Console.WriteLine("You will add int with their values; type 0 to " +
                      "exit");
    while(true)
    {
        Console.WriteLine("enum int:");
        int ii = Convert.ToInt32(Console.ReadLine());
        if (ii == 0) break;
        Console.WriteLine("enum value:");
        string v = Console.ReadLine();
        Console.WriteLine("will try to assign the enum TestType with " + 
                          "value: " + v + " by '" + ii + "' int value.");
        NewEnumValue(ii,v);
    }

    // Results:
    Console.WriteLine(d[(int)s]); // Result: FocusedAphasia
    Console.WriteLine(d[(int)e]); // Result: Aphasia
}