2013-09-28 59 views
0

我已经搜索并找到很多示例,但仍然需要专家的帮助。 低于在Java代码:如何在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; 
    } 
};} 

上面的代码是不正确的,因为每个编译器,但我知道如何使它工作。请帮忙。谢谢。

回答

3

这是你的方法的一个工作版本:

// 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; 
    } 
} 
+0

谢谢。我了解解决方法。 –