带有参数的枚举

时间:2018-08-06 04:45:24

标签: c# unity3d

在C#中是否可以在枚举中而不是专用类中收集信息?

示例如何在Java中工作:

  public enum Action {

    JUMP( "JUMP", 1),
    CROUCH ("CROUCH", 2),
    ;

    private String animationId;
    private int buttonId;

    private Action( String animationId, int buttonId) {
      this.animationId = animationId;
      this.buttonId = buttonId;
    }

    public String getAnimationId() {
      return animationId;
    }

    public int getButtonId() {
      return buttonId;
    }
  }

3 个答案:

答案 0 :(得分:3)

您可以将枚举与属性一起使用:

public enum Action{
  [MyValue("JUMP", 1)]
  JUMP,

  [MyValue("CROUCH", 2)]
  CROUCH
}

[AttributeUsage(
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = true)]
public class MyValueAttribute : System.Attribute{
  public string Value{get; private set}
  public string AnimationId{get; private set;}
  public MyValueAttribute(string animationId, string value){
     AnimationId = animationId;
     Value = value;
}

您将获得如下价值:

public static class EnumExtensions{
        public static string GetValue(this Enum value)
        {
            var type = value.GetType();
            var name = Enum.GetName(type, value);
            if (name == null) return string.Empty;
            var field = type.GetField(name);
            if (field == null) return string.Empty;
            var attr = Attribute.GetCustomAttribute(field, typeof(MyValueAttribute)) as MyValueAttribute;
            return attr != null ? attr.Value: string.Empty;
        }

        public static string GetAnimationId(this Enum value)
        {
            var type = value.GetType();
            var name = Enum.GetName(type, value);
            if (name == null) return string.Empty;
            var field = type.GetField(name);
            if (field == null) return string.Empty;
            var attr = Attribute.GetCustomAttribute(field, typeof(MyValueAttribute)) as MyValueAttribute;
            return attr != null ? attr.AnimationId: string.Empty;
        }
}

用法:

Action.JUMP.GetValue();
Action.JUMP.GetAnimationId();

或者您可以使用一种方法,例如返回TupleAnimationIdValue

答案 1 :(得分:3)

否,但是您可以改用静态类字段:

public sealed class Action
{
    public static readonly Action JUMP = new Action("JUMP", 1);
    public static readonly Action CROUCH = new Action("CROUCH", 2);

    public string AnimationId { get; }
    public int ButtonId { get; }

    private Action(String animationId, int buttonId)
    {
        AnimationId = animationId;
        ButtonId = buttonId;
    }

    public override string ToString() => AnimationId;
}

答案 2 :(得分:0)

您绝对可以使用建议的属性。但是,您可以对枚举值调用.ToString()以将其名称作为字符串值获取,也可以为它们分配int值。默认情况下,它们根据索引分配为0-X。但是您可以这样做

public enum Action {
JUMP=1, 
CROUCH=2
}

然后访问这些值

Action action = Action.JUMP;
int value = (int) action; //Is set to 1
string name = action.ToString(); //Is set to "JUMP"

尽管这肯定在每种情况下都行不通,具体取决于您希望枚举存储的数量,但是对于您所描述的情况,这要容易得多。