繁体   English   中英

带有参数的枚举

[英]Enum with parameters

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

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

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

或者您可以使用一种方法,例如返回带有AnimationIdValue Tuple

不,但是您可以使用静态类字段代替:

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

您绝对可以使用建议的属性。 但是,您可以对枚举值调用.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"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM