2016-10-03 90 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