我习惯在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
}