c#中的参数枚举

  • 本文关键字:枚举 参数 c# enums
  • 更新时间 :
  • 英文 :


我习惯在Java中编程,但是对于这个项目,我应该使用c#,我试图将我的包系统从我的Java项目转换过来,但是我使用c#编译器遇到了一些问题。代码如下:

abstract class Packet
{
    public static enum PacketTypes
    {
        INVALID(-1), LOGIN(00);
        private int packetId;
        private PacketTypes(int packetId)
        {
            this.packetId = packetId;
        }
        public int getId()  { return packetId; }
    }
}

这实际上正是在我的Java代码中如何完成的,并且我让单个数据包扩展了Packet类。我正在努力弄清楚如何在c#中将这一切结合在一起。也许每个包都有一个单独的类并不是这里应该做的?

我不确定你想要实现什么,但你可以在c#中为特定的enum元素设置值:

public enum PacketTypes
{
    INVALID = -1;
    LOGIN = 0;
}

因为enum默认由int支持,所以您可以将它从/转换为int,而无需额外的代码。

enum在c#中不能包含任何成员,所以你不能在enum声明中添加方法/属性/字段。

与Java中的enum s是类不同,c#中的enum s是纯值。它们不能有成员函数或字段。

有一种方法可以帮助您为enum定义一个扩展方法,如:
public static class PacketTypesExtensions {
    static readonly IDictionary<PacketTypes,int> IdForType = new Dictionary<PacketTypes,int> {
        { PacketTypes.INVALID, -1 }
    ,   { PacketTypes.LOGIN,    0 }
    };
    static readonly IDictionary<PacketTypes,string> DescrForType = new Dictionary<PacketTypes,string> {
        { PacketTypes.INVALID, "<invalid packet type>" }
    ,   { PacketTypes.LOGIN,   "<user login>" }
    };
    public static string Description(this PacketTypes t) {
        return DescrForType[t];
    }
    public static int Id(this PacketTypes t) {
        return IdForType[t];
    }
}

这允许您保留Java语法:

PacketTypes pt = ... // <<== Assign a packet type here
int id = pt.Id();    // This calls the static extension method
string d = pt.Description();

除了Marcins的回答,你还可以试试这个。

public enum PacketTypes
{
    INVALID = -1;
    LOGIN = 0;
}
public class Packet
{
    public PacketTypes PacketType { get; set;}
}

在你的代码中,你可以这样做

public void DoSomething()
{
    var packet = new Packet();
    packet.PacketType = PacketTypes.INVALID; // Assign packtype
    Console.WriteLine(packet.PacketType.ToString()); // Retrieve and print 
}

最新更新