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否,不能使这样的类成为泛型的。关键是所有实例及其值都是在编译时指定的。如果该类型是泛型的,则无法在编译时提供所有值。