我问这个问题,尽管在枚举和匹配属性的C#命名约定中读过类似但不完全正确的内容
我发现我倾向于将枚举命名为复数,然后将它们用作单数,例如:
public enum EntityTypes {
Type1, Type2
}
public class SomeClass {
/*
some codes
*/
public EntityTypes EntityType {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
当然它有效,这是我的风格,但任何人都可以找到这种惯例的潜在问题吗?我确实有一个"丑陋"的命名与"状态"一词:
public enum OrderStatuses {
Pending, Fulfilled, Error, Blah, Blah
}
public class SomeClass {
/*
some codes
*/
public OrderStatuses OrderStatus {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
附加信息:也许我的问题不够明确.在命名我定义的枚举类型的变量时,我经常要努力思考.我知道最佳实践,但它无助于简化命名这些变量的工作.
我不可能将我的所有枚举属性(比如"状态")公开为"MyStatus".
我的问题:任何人都可以找到上述惯例的潜在问题吗?这不是最佳做法.
问题改写:
嗯,我想我应该这样问这个问题:有人能用一种很好的通用方法来命名枚举类型,这样在使用时,枚举"实例"的命名会非常简单吗?
首先,我将说明我对C#中的枚举更加熟悉,看起来java中的枚举非常混乱.
正如您所看到的,我正在尝试在下一个示例中使用switch语句@enums,但无论我在做什么,我总是会收到错误.
我收到的错误是:
SomeClass.AnotherClass.MyEnum.VALUE_A
必须使用不合格的枚举常量替换合格的案例标签VALUE_A
事情是我非常理解错误,但我不能只编写VALUE_A,因为枚举位于另一个子类中.有没有办法解决这个问题?为什么它会在Java中发生?
//Main Class
public class SomeClass {
//Sub-Class
public static class AnotherClass {
public enum MyEnum {
VALUE_A, VALUE_B
}
public MyEnum myEnum;
}
public void someMethod() {
MyEnum enumExample //...
switch (enumExample) {
case AnotherClass.MyEnum.VALUE_A: { <-- error on this line
//..
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个返回int类型的函数.但是,我只有TAX枚举的值.
如何将TAX枚举值转换为int?
public enum TAX {
NOTAX(0),SALESTAX(10),IMPORTEDTAX(5);
private int value;
private TAX(int value){
this.value = value;
}
}
TAX var = TAX.NOTAX; // This value will differ
public int getTaxValue()
{
// what do do here?
// return (int)var;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举
public enum Event {
FORGOT_PASSWORD("forgot password");
private final String value;
private Event(final String description) {
this.value = description;
}
@JsonValue
final String value() {
return this.value;
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个@JsonValue,这似乎完成了将对象序列化为:
{"event":"forgot password"}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试反序列化时,我得到了一个
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.globalrelay.gas.appsjson.authportal.Event from String value 'forgot password': value not one of declared Enum instance names
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
可能重复:
通过其描述属性查找枚举值
我有一个通用的扩展方法,它Description
从以下方式获取属性Enum
:
enum Animal
{
[Description("")]
NotSet = 0,
[Description("Giant Panda")]
GiantPanda = 1,
[Description("Lesser Spotted Anteater")]
LesserSpottedAnteater = 2
}
public static string GetDescription(this Enum value)
{
FieldInfo field = value.GetType().GetField(value.ToString());
DescriptionAttribute attribute
= Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
as DescriptionAttribute;
return attribute == null ? value.ToString() : attribute.Description;
}
Run Code Online (Sandbox Code Playgroud)
所以我可以......
string myAnimal = Animal.GiantPanda.GetDescription(); // = "Giant Panda"
Run Code Online (Sandbox Code Playgroud)
现在,我正试图在另一个方向上找出等效函数,比如......
Animal a = (Animal)Enum.GetValueFromDescription("Giant Panda", typeof(Animal));
Run Code Online (Sandbox Code Playgroud) 如何在C++中将int转换为枚举?
例如:
enum Test
{
A, B
};
int a = 1;
Run Code Online (Sandbox Code Playgroud)
如何转换a
为Test :: A类型?
假设我们有enum
以下内容:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Run Code Online (Sandbox Code Playgroud)
我想创建一个这样的实例enum
并用适当的值初始化它,所以我做:
Days day = Days.Saturday;
Run Code Online (Sandbox Code Playgroud)
现在我想用现有enum
值检查我的变量或实例,所以我这样做:
if (day == Days.Saturday)
{
std::cout << "Ok its Saturday";
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个编译错误:
错误:'.'之前的预期primary-expression 代币
所以要说清楚,说:有什么区别:
if (day == Days.Saturday) // Causes compilation error
Run Code Online (Sandbox Code Playgroud)
和
if (day == Saturday)
Run Code Online (Sandbox Code Playgroud)
?
这两个实际上是指什么,一个是好的,一个导致编译错误?
在C#中,是否可以使用属性修饰Enum类型或执行其他操作来指定默认值应该是什么,而不更改值?无论出于何种原因,所需的数字可能都是一成不变的,并且仍然可以控制默认值.
enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
Orientation o; // Is 'North' by default.
Run Code Online (Sandbox Code Playgroud) 对于我的生活,我不记得如何设置,删除,切换或测试位域中的位.要么我不确定,要么混淆它们,因为我很少需要这些.因此,"比特作弊表"会很好.
例如:
flags = flags | FlagsEnum.Bit4; // Set bit 4.
Run Code Online (Sandbox Code Playgroud)
要么
if ((flags & FlagsEnum.Bit4)) == FlagsEnum.Bit4) // Is there a less verbose way?
Run Code Online (Sandbox Code Playgroud)
您能举例说明所有其他常见操作,最好是使用[Flags]枚举的C#语法吗?