我需要用C#编写这段代码。任何帮助,将不胜感激。 接口和第一类是问题所在。如何将其转换为C#? EnumByteConverter& EnumByteConverter&GT ;? 这甚至可能吗?我的选择是什么?
public interface EnumByteConverter<E extends Enum<E> & EnumByteConverter<E>>
{
byte convert();
E convert(byte val);
}
public class ReverseByteEnumMap<V extends Enum<V> & EnumByteConverter>
{
private Map<Byte, V> map = new HashMap<>();
public ReverseByteEnumMap(Class<V> valueType)
{
for (V v : valueType.getEnumConstants())
{
map.put(v.convert(), v);
}
}
public V get(byte num)
{
return map.get(num);
}
}
public enum Transport implements EnumByteConverter<Transport>
{
FrameFormatB(0),
FrameFormatA(1),
FrameDraft(254),
FrameUnknown(255);
private static ReverseByteEnumMap<Transport> map = new ReverseByteEnumMap<>(Transport.class);
private final byte value;
Transport(int value)
{
this.value = (byte) value;
}
public byte convert()
{
return value;
}
public Transport convert(byte val)
{
return map.get(val);
}
public static Transport get(byte val)
{
return map.get(val);
}
}
这是我尝试过的。我设法使用struct实现接口,并使用类似的东西实现反向类。
public interface IEnumByteConverter<E> where E : struct
{
byte Convert();
E Convert(byte val);
}
}
public class ReverseByteEnumMap<T> where T : struct, IEnumByteConverter<T>
{
private Dictionary<Byte, T> map = new Dictionary<Byte, T>();
private IEnumByteConverter<T> converter;
public ReverseByteEnumMap(T valueType)
{
foreach (T t in Enum.GetValues(typeof(T)))
map.Add(t.Convert() , t);
}
public T Get(byte num)
{
return map[num];
}
}
public class Transport : IEnumByteConverter<TransportEnums>
{
public enum TransportEnums
{
FrameFormatB = 0,
FrameFormatA = 1,
FrameDraft = 254,
FrameUnknown = 255
}
private static ReverseByteEnumMap<Transport> map = new ReverseByteEnumMap<Transport> ();
private byte value;
Transport(int value)
{
this.value = (byte)value;
}
public byte Convert()
{
return value;
}
public TransportEnums Convert(byte val)
{
return map.Get(val);
}
public static TransportEnums Get(byte val)
{
return map.Get(val);
}
}
但是我被困在最后一堂课。我不能使用Transport.class或枚举。我不知道这是否是我正在前进的正确道路
答案 0 :(得分:1)
在C#中,(非常)容易更改enum
的基本类型:
public enum Transport : byte
{
FrameFormatB = 0,
FrameFormatA = 1,
FrameDraft = 254,
FrameUnknown = 255
}
并且很容易从enum
转换为基本类型并返回:
Transport t1 = (Transport)255; // Equivalent to = Transport.FrameUnknown
int i1 = (int)t1; // 255
byte b1 = (byte)t1; // 255
所以你不需要你写的所有支持代码。
在Java enum
中,通常没有&#34;值&#34;的类,如果你想给它们一个数值,你必须做的就像你写的那样代码:定义value
字段。然后你必须添加方法来enum
&#34;名称&#34;它的价值&#34;然后回来。
这里的主要问题是C#(。NET)enum
实际上可以有任何值,而不仅仅是已定义的值:
Transport t2 = (Transport)100;
虽然在Java中只有enum
的定义值是合法的(因为它们是定义的enum
类的唯一实例。其他实例无法创建)。请参阅示例https://stackoverflow.com/a/469315/613130。
您编写的代码与此代码非常相似:http://dan.clarke.name/2011/07/enum-in-java-with-int-conversion/