C#调用和引用枚举

C#调用和引用枚举,c#,enums,C#,Enums,我不太清楚这个问题怎么说。。但不管怎样,这就是我要做的 假设我有两个枚举: enum test1 : byte { byte1 = 0x00; byte2 = 0x01; byte3 = 0x02; } enum test2 : byte { byte1 = 0x10; byte2 = 0x20; byte3 = 0x30; } 我知道我无法将枚举分组到另一个枚举中,只是试图描述我正在尝试做的事情 我希望能够对它们进行分组,例如: enum t

我不太清楚这个问题怎么说。。但不管怎样,这就是我要做的

假设我有两个枚举:

enum test1 : byte
{
    byte1 = 0x00;
    byte2 = 0x01;
    byte3 = 0x02;
}

enum test2 : byte
{
    byte1 = 0x10;
    byte2 = 0x20;
    byte3 = 0x30;
}
我知道我无法将枚举分组到另一个枚举中,只是试图描述我正在尝试做的事情

我希望能够对它们进行分组,例如:

enum testGroup
{
  test1,
  test2
}
之后,能够调用并引用他们:

void main() {
    runTest(testGroup.test2);
}

void runTest(testGroup group)
{
    Console.WriteLine(group.byte2);
}
基本上,该方法将为作为参数传递的任何枚举打印字节2

例如,我将test1作为参数传递到runTest,它打印字节2的值,即0x01,或者我将test2作为参数传递,然后它打印字节2,即0x20


如何实现这一点?

与使用实际的
enum
类型不同,您可以创建自己的类型,在一定程度上模拟
enum
模式,方法是使用私有构造函数,然后将固定数量的静态字段初始化为适当的值。这使您可以使用类似于
enum
的功能,但不需要将单个整数类型封装为其值

public class Group
{
    private Group(byte a, byte b, byte c)
    {
        A = a;
        B = b;
        C = c;
    }

    public byte A { get; private set; }
    public byte B { get; private set; }
    public byte C { get; private set; }

    public static readonly Group One = new Group(0, 1, 2);
    public static readonly Group Two = new Group(8, 16, 24);
}

现在,您可以有一个方法接受
,您可以在其中传入
组.One
组.Two

而不是使用实际的
枚举
类型,您可以创建自己的类型,在一定程度上模拟
枚举
模式,通过有一个私有构造函数,然后有固定数量的静态字段,每个字段初始化为适当的值。这使您可以使用类似于
enum
的功能,但不需要将单个整数类型封装为其值

public class Group
{
    private Group(byte a, byte b, byte c)
    {
        A = a;
        B = b;
        C = c;
    }

    public byte A { get; private set; }
    public byte B { get; private set; }
    public byte C { get; private set; }

    public static readonly Group One = new Group(0, 1, 2);
    public static readonly Group Two = new Group(8, 16, 24);
}
enum test1:byte
{
    byte1 = 0x00,
    byte2 = 0x01,
    byte3 = 0x02
}

enum test2 : byte
{
    byte1 = 0x10,
    byte2 = 0x20,
    byte3 = 0x30
}
现在,您可以有一个接受
组的方法,在该方法中,您可以将
组.One
组.Two
传入该组

enum test1:byte
{
    byte1 = 0x00,
    byte2 = 0x01,
    byte3 = 0x02
}

enum test2 : byte
{
    byte1 = 0x10,
    byte2 = 0x20,
    byte3 = 0x30
}
test1和test2对不同的值有相同的名称,但单个枚举不能有重复的名称

使用
enumtestgroup{test1,test2}
可以创建一个包含两个值0和1的枚举,名为test1和test2

试试这个:

enum testGroup
{
    e0 = test1.byte1,
    e1 = test1.byte2,
    e2 = test1.byte3,
    e10 = test2.byte1,
    e20 = test2.byte2,
    e30 = test2.byte3,
}

testGroup tg = (testGroup)test1.byte3;
Console.WriteLine(tg); // prints e2
Console.WriteLine((int)tg); // prints 2
test1和test2对不同的值有相同的名称,但单个枚举不能有重复的名称

使用
enumtestgroup{test1,test2}
可以创建一个包含两个值0和1的枚举,名为test1和test2

试试这个:

enum testGroup
{
    e0 = test1.byte1,
    e1 = test1.byte2,
    e2 = test1.byte3,
    e10 = test2.byte1,
    e20 = test2.byte2,
    e30 = test2.byte3,
}

testGroup tg = (testGroup)test1.byte3;
Console.WriteLine(tg); // prints e2
Console.WriteLine((int)tg); // prints 2

您希望从
runTest()
中得到什么值,以及得到什么?这里有一个类似的问题:您说“我将test1作为参数传递给runTest”,但
test1
是一个类型,而不是一个值。您是否正在传递
test1.byte1
test1.byte2
?您是在尝试对两个不同的枚举进行分组,还是在同一个枚举中尝试对两个值进行分组。也就是说,你能有一个枚举,如果它们返回字节1或字节2,那么它就通过了吗?@StriplingWarrior;他试图传递所有三个字节的组,而不是任何一个字节。您希望从
runTest()
中获得什么值,以及得到什么?类似的问题是:您说“我将test1作为参数传递给runTest”,但
test1
是一个类型,而不是一个值。您是否正在传递
test1.byte1
test1.byte2
?您是在尝试对两个不同的枚举进行分组,还是在同一个枚举中尝试对两个值进行分组。也就是说,你能有一个枚举,如果它们返回字节1或字节2,那么它就通过了吗?@StriplingWarrior;他试图传递所有三个字节的组,而不是任何一个字节。这不允许他将前三个字节或后三个字节的组传递给一个方法,而该方法不需要知道给出了哪一组三个字节。这不允许他将前三个字节或后三个字节的组传递给一个方法,方法不需要知道给出的是哪一组三个字节。也可以使类成为泛型,因此它也希望枚举的类型声明。@Bauss不,不能使这样的类成为泛型。关键是所有实例及其值都是在编译时指定的。如果该类型是泛型的,则无法在编译时提供所有值。也可以使该类成为泛型的,因此它也希望枚举的类型声明。@Bauss否,不能使这样的类成为泛型的。关键是所有实例及其值都是在编译时指定的。如果该类型是泛型的,则无法在编译时提供所有值。