C# 带参数的枚举

C# 带参数的枚举,c#,unity3d,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.anima

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

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

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

或者您可以使用一种方法返回,例如
Tuple
AnimationId
以及
Value
您可以使用带有属性的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();

或者您可以使用一种方法返回,例如
Tuple
AnimationId
Value
您可以使用建议的属性。但是,您可以对枚举值调用
.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"

虽然这当然不会在任何情况下都起作用,这取决于您希望枚举存储多少,但对于您描述的情况,这要容易得多。

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

虽然这当然不会在任何情况下都起作用,这取决于您希望枚举存储多少,但对于您描述的情况,这要容易得多。

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

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

不可以,但可以使用静态类字段:

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


如果你不想要一个classno,你可以使用
struct
,但是你可以使用一个带有公共静态字段的密封类,因为C#&Java中的枚举值
enum
是不同的构造,请看区别。嗯……你如何实现唯一性?你可能想看看Jon Skeet的。不确定结果如果不需要classno,可以使用
struct
,但可以使用带有公共静态字段的密封类,因为C#&Java中的枚举值
enum
是不同的构造,请参见差异。嗯……如何强制唯一性?您可能想查看Jon Skeet的。不确定结果
字符串
animationId如何?当然,这将为所有枚举提供一个
GetAnimationId()
方法。但我印象深刻的是,这是有效的。不是所有的枚举。方法GetAnimationId将只为指定的枚举提供值:
Action.JUMP.GetAnimationId()
字符串
animationId如何?当然,这将为所有枚举提供一个
GetAnimationId()
方法。但我印象深刻的是,这是有效的。不是所有的枚举。方法GetAnimationId将只为指定的枚举提供值:
Action.JUMP.GetAnimationId()
字符串
animationId如何?在您的示例中,您将animationId设置为枚举值的实际名称。这是字符串animationId=action.ToString();如果希望animationId不是枚举值的名称,则此操作将不起作用。
字符串
animationId如何?在您的示例中,您将animationId设置为枚举值的实际名称。这是字符串animationId=action.ToString();如果您希望animationId不是枚举值的名称,这将不起作用。“…静态类字段…”-这就是所谓的类型安全枚举模式。我想“不”是正确的答案。ToString()不应该是AnimationId,因为我的示例很简单。主要目的是不在cs文件中使用上下文外标识符。@Roland,
ToString
实现是不必要的,可以根据需要进行更改。例如,它在字符串插值中很有用:
var a=$“基本操作:{action.JUMP}!”
“…静态类字段…”-这就是所谓的类型安全枚举模式。我想“不”是正确的答案。ToString()不应该是AnimationId,因为我的示例很简单。主要目的是不在cs文件中使用上下文外标识符。@Roland,
ToString
实现是不必要的,可以根据需要进行更改。例如,它在字符串插值中很有用:
var a=$“基本操作:{action.JUMP}!”