C# 带参数的枚举
在C#中是否可以在枚举中而不是在专用类中收集信息 在Java中如何工作的示例: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
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}!”