2016-10-03 92 views
-4
public EnumA 
{ 
name = 1, 
surname = 2 
} 
public EnumB 
{ 
name = 50, 
surname = 60 
} 

public void myMethod(User u,Enum e) 
{ 
//Enum e can be either EnumA or EnumB 
//Do something with the Enum Passed 
} 

比方說,我有上面的代碼,但不是像我上面做的方法specifiying枚舉,我想選擇,它傳遞枚舉通過方法參數。有沒有這樣做的方法?通行證枚舉在C#中的參數或任何替代

+4

你能舉出更多關於你想看到什麼輸出以及你如何調用'myMethod'的例子嗎?我還不清楚你正在努力完成什麼。 –

+0

@BradleyUffner根據哪個枚舉通過我想要獲得所有的枚舉值 – erbsoftware

+0

所有的枚舉都有'name'和'surname'成員嗎? –

回答

0

你有沒有試過如下:

public void myMethod(User u,Enum e) 
{ 
    if (e is EnumA) 
    { 
     EnumA ea = (EnumA)e; 
     // Do something with ea 
    } 
    else if (e is EnumB) 
    { 
     EnumB eb = (EnumB)e; 
     ... 
    } 
} 
+0

這將工作,但如果我有太多的枚舉(這是不實際的,但這是我工作的解決方案在) – erbsoftware

+4

如果你有這麼多的枚舉,那麼你做錯了。我甚至無法看到您在示例中提供的枚舉的原因。你知道有「旗幟」枚舉嗎? –

-1

這不是枚舉的行爲(或應該表現)。你基本上創建了兩個不同的枚舉實例。這就是爲什麼C#中存在類。考慮創建一個類:

public class SomeEnum 
{ 
    public int Name; 
    public int Surname; 

    private SomeEnum(int name, int surname) 
    { 
     Name = name; 
     Surname = surname; 
    } 

    public static SomeEnum EnumA => new SomeEnum(1, 2); 
    public static SomeEnum EnumB => new SomeEnum(50, 60); 
} 

並改變你的方法是:

public void myMethod(User u, SomeEnum e) 
{ 
    // Enum e can be either EnumA or EnumB 
    // Do something with the Enum passed 
} 

我改變最少的代碼,儘可能我不知道目的是這些「枚舉」什麼的,但通過這種方式,您可以根據需要創建任意多個實例,而不會讓您的代碼混淆所有這些相同的Enum規範。

要使用EnumA的這種方法,例如您可以撥打myMethod(user, SomeEnum.EnumA)

這種方式只能使用指定的枚舉(EnumAEnumB)。另外,如果你想創建即時枚舉,代碼可以改爲:

public class SomeEnum 
{ 
    public int Name; 
    public int Surname; 

    public SomeEnum(int name, int surname) 
    { 
     Name = name; 
     Surname = surname; 
    } 
} 

這樣你就可以調用該方法myMethod(user, new SomeEnum(1, 2))

0

您對此操作使用泛型類型。

下面的代碼顯示了一個示例代碼(作爲控制檯應用程序);

class Program 
    { 
     static void Main(string[] args) 
     { 
      myMethod<EnumA>("deneme", EnumA.name); 
     } 

     public enum EnumA 
     { 
      name = 1, 
      surname = 2 
     } 
     public enum EnumB 
     { 
      name = 50, 
      surname = 60 
     } 

     public static void myMethod<T>(string u, T e) 
      where T : struct,IConvertible 
     { 
      if (typeof(T) == typeof(EnumA)) 
      { 
       Console.WriteLine("EnumA"); 
      } 
      else if (typeof(T) == typeof(EnumB)) 
      { 
       Console.WriteLine("EnumB"); 
      } 

      Console.ReadLine(); 

     } 
    } 
1

你可以通過反射來做到這一點,但我擔心你不能正確理解枚舉。它看起來像我正在嘗試使用它們作爲類實例來保存任意數據,在這種情況下,你真的應該使用真實的class

如果我錯了,我已經包含下面的代碼來做你所要求的,但我認爲它不會對你有用。

void Main() 
{ 
    Test(EnumA.First); 
    Console.WriteLine("-----"); 
    Test(EnumB.B); 
} 

void Test(Enum theEnum) 
{ 
    Type t = theEnum.GetType(); 
    foreach (string element in Enum.GetNames(t)) 
    { 
     Debug.WriteLine(element + " = " + (int) Enum.Parse(t, element)); 
    } 
} 

enum EnumA 
{ 
    First = 1, 
    Second = 2 
} 

enum EnumB 
{ 
    A = 1, 
    B = 2, 
    C = 3 
} 

它會生成以下的輸出:

First = 1 
Second = 2 
----- 
A = 1 
B = 2 
C = 3 

認爲這更是你正在嘗試做雖然:

void Main() 
{ 
    Person A = new Person() 
    { 
     Name = "John", 
     Surname = "Doe" 
    }; 

    Person B = new Person() 
    { 
     Name = "Jane", 
     Surname = "Doe" 
    }; 

    A.ShowInfo(); 
    Console.WriteLine("----"); 
    B.ShowInfo(); 
} 

class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 

    public void ShowInfo() 
    { 
     Debug.WriteLine("Name=" + Name); 
     Debug.WriteLine("Surname=" + Surname); 
    } 
} 

它輸出如下:

Name=John 
Surname=Doe 
---- 
Name=Jane 
Surname=Doe