【问题标题】:Convert from Java to C#从 Java 转换为 C#
【发布时间】:2018-06-06 09:44:01
【问题描述】:

我需要用 C# 编写这段代码。任何帮助,将不胜感激。 接口和第一类是问题所在。如何将其转换为 C#? EnumByteConverter & EnumByteConverter>? 这甚至可能吗?我的选择是什么?

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);
  }
}

这是我尝试过的。我设法使用结构来实现接口,并使用类似的东西实现反向类。

  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 也不能使用枚举。我不知道这是否是我前进的正确道路

【问题讨论】:

  • 你尝试了什么?
  • 这完全有可能,但不幸的是,SO 不是代码编写服务。欢迎随时提出具体的主题问题!
  • @Lucas 在他的辩护中,代码似乎有点复杂。我不知道如何翻译它(但我不做java)。对我来说,根据规范来修改它比逐行翻译更容易。
  • @AdrianoRepetti 我会说 1:1 的翻译是绝对不可能的。在 C# 中,您不能子类化 enum。您可以尝试构建类似的东西,但不会非常相似。
  • @calliste 代码无法翻译。有可能的是,给定足够的用例来构建类似的东西。

标签: c# generics enums


【解决方案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 是通常没有“值”的类,如果你想给它们一个数值,你必须像代码中写的那样:定义一个 value 字段。然后你必须添加从enum“名称”到它的“值”并返回的方法。

这里的主要问题是 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/

【讨论】:

  • 感谢您的回答@xanatos 我会检查链接。这只是界面的编写方式。当它不是你的代码时,你就很难绕过它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 2011-05-13
  • 1970-01-01
  • 2013-08-20
  • 2020-04-02
  • 2023-03-14
  • 2012-01-28
相关资源
最近更新 更多