簡體   English   中英

如何在C#中轉換Java枚舉

[英]how to convert java enums in c#

我已經搜索並找到許多示例,但仍然需要專家幫助。 在下面的Java代碼中:

public class myClass {

    public static enum myEnum {
    P("aco", 1000, 4, 8), L("acs", 2100,
            1, 9), S("acn", 3500, 1, 6), H("ach", 5400, 1, 6);

    final public String cc;
    final int bt;
    final int Qp;
    final int lp;

    private myEnum(String cc, int bt, int Qp, int lp) {
        this.cc = cc;
        this.bt = bt;
        this.Qp = Qp;
        this.lp = lp;
    }
};}

我嘗試通過查看示例將其轉換為如下所示:

using System.Reflection;
using System;

[System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
public class EnumAttr : System.Attribute
{
    public EnumAttr()
    {
    }     
}

public static class EnumExtension
{
    public static EnumAttr GetAttr(this Enum value)
    {
        Type type = value.GetType();
        FieldInfo fieldInfo = type.GetField(value.ToString());
        var atts = (EnumAttr[])fieldInfo.GetCustomAttributes(typeof(EnumAttr), false);
        return atts.Length > 0 ? atts[0] : null;
    }
}

public class myEnumAttr : EnumAttr
{
    public string Desc { get; set; }
} 

public class myClass
{
    public enum myEnum
    {
        [myEnumAttr("aco", 1000, 4, 8)]P, 
        [myEnumAttr("acs", 2100, 1, 9)]L,
        [myEnumAttr("acn", 3500, 1, 6)]S, 
        [myEnumAttr("ach", 5400, 1, 6)]H,

    public String cc;
    int bt;
    int Qp;
    int lp;

    private void myEnum(String cc, int bt, int Qp, int lp) {
        this.cc = cc;
        this.bt = bt;
        this.Qp = Qp;
        this.lp = lp;
    }
};}

根據我所知道的編譯器,以上代碼是不正確的,但是如何使它起作用。 請幫忙。 謝謝。

這是您的方法的有效版本:

// use like
string desc = myEnum.P.GetAttr().Desc;

[System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
public class EnumAttr : System.Attribute
{
    public EnumAttr()
    {
    }     
}

public static class EnumExtension
{
    public static EnumAttr GetAttr(this Enum value)
    {
        Type type = value.GetType();
        FieldInfo fieldInfo = type.GetField(value.ToString());
        var atts = (EnumAttr[])fieldInfo.GetCustomAttributes(typeof(EnumAttr), false);
        return atts.Length > 0 ? atts[0] : null;
    }
    public static myEnumAttr GetAttr(this myEnum value)
    {
        Type type = value.GetType();
        FieldInfo fieldInfo = type.GetField(value.ToString());
        var atts = (myEnumAttr[])fieldInfo.GetCustomAttributes(typeof(myEnumAttr), false);
        return atts.Length > 0 ? atts[0] : null;
    }
}

public class myEnumAttr : EnumAttr
{
    public string Desc { get; set; }

    int bt;
    int Qp;
    int lp;

    public myEnumAttr(String desc, int bt, int Qp, int lp) {
        this.Desc = desc;
        this.bt = bt;
        this.Qp = Qp;
        this.lp = lp;
    }
} 

public enum myEnum
{
    [myEnumAttr("aco", 1000, 4, 8)]P, 
    [myEnumAttr("acs", 2100, 1, 9)]L,
    [myEnumAttr("acn", 3500, 1, 6)]S, 
    [myEnumAttr("ach", 5400, 1, 6)]H,
}

但是,我不確定這是否是解決此問題的最佳方法。 也許將類的實例與private構造函數一起使用會更有意義。

// use like
string desc = MyEnumLike.P.Desc;

public sealed class MyEnumLike
{
    public static readonly MyEnumLike P = new MyEnumLike("aco", 1000, 4, 8);
    public static readonly MyEnumLike L = new MyEnumLike("acs", 2100, 1, 9);
    public static readonly MyEnumLike S = new MyEnumLike("acn", 3500, 1, 6);
    public static readonly MyEnumLike H = new MyEnumLike("ach", 5400, 1, 6);

    public string Desc { get; set; }

    int bt;
    int Qp;
    int lp;

    private MyEnumLike(String desc, int bt, int Qp, int lp) {
        this.Desc = desc;
        this.bt = bt;
        this.Qp = Qp;
        this.lp = lp;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM