C# 将函数中的字符串转换为枚举
我有一个方法,它接受两个枚举并返回一个C# 将函数中的字符串转换为枚举,c#,string,enums,C#,String,Enums,我有一个方法,它接受两个枚举并返回一个bool[]。然而,在实践中,我有一个字符串,我想通过将其转换为枚举来传递它 我有以下代码: path = StatePath.statePath(Enum.GetName(typeof(StatePath.States), currentState), (Enum.GetName(typeof(StatePath.States), stable_state_ENDDR)); 这里,currentState和stable\u state\u END
bool[]
。然而,在实践中,我有一个字符串,我想通过将其转换为枚举来传递它
我有以下代码:
path = StatePath.statePath(Enum.GetName(typeof(StatePath.States), currentState), (Enum.GetName(typeof(StatePath.States), stable_state_ENDDR));
这里,currentState和stable\u state\u ENDDR
是我从其他代码中检索到的字符串。这些字符串的值与状态枚举中的枚举匹配。代码抛出一个错误,表示无法从字符串转换为枚举。我已经尝试了在StackOverflow和Google上找到的几个例子,但没有一个有效的解决方案。
怎么办?在不知道函数签名的情况下,这很难回答,但我认为您正在寻找:声明枚举
eCurrentState
和eStable\u state\u ENDDR
,然后使用
Enum.TryParse(currentState, out eCurrentState);
Enum.TryParse(stable_state_ENDDR, out eStable_state_ENDDR);
path = StatePath.statePath(eCurrentState, eStable_state_ENDDR);
如果TryParse
失败,则返回false
也就是说,一般的经验法则是避免出现类似的情况,并将枚举作为int
或位标志传递,这是因为在内部,枚举就是这样存储的,不需要转换函数来降低速度。基本上,SomeEnum==someIntValue
不需要任何转换就可以直接工作。因此,假设您是从某个服务器/db获取数据,只需请求数据作为一个数值,该数值等于在中声明的枚举的索引。相反,以相同的方式存储数据
e、 g.使用任何枚举,不声明属性
enum SomeEnum
{
abc, // 0
def, // 1
g // 2
}
abc==0
,def==1
,g==2
,将返回true。调用Enum.Parse
并将返回值强制转换为您的枚举类型,例如:
string currentState = "...";
States states = (StatePath.States)Enum.Parse(typeof(StatePath.States), currentState);
还有一个TryParse
过载:
if (Enum.TryParse(typeof(StatePath.States), currentState, out object o))
StatePath.States states = (StatePath.States)o;
…和一个通用版本,它使您不必自己显式地强制转换值:
if (Enum.TryParse(currentState, out StatePath.States state))
Enum.Parse。GetName返回字符串,而不是枚举。提供StatePath的签名。StatePath将更清晰。在编译时或运行时“抛出错误”?发布错误。(StatePath.States)Enum.Parse(typeof(StatePath.States),currentState)
应该为您提供枚举值。您的statePath方法可能正在接受枚举,但您正在传递字符串。TryParse
是一种通用方法。它不把类型作为参数,而是作为类型参数。完整格式:Enum.TryParse(currentState,out-StatePath.States-value)
@pinkfloydx33:它也是非通用版本。这就是我在示例中使用的方法。但我没有更新我的答案,以反映有一个通用版本,为您执行铸造。我检查了参考来源和MSDN之前张贴。奇怪的这两个地方都没有,但SharpLab确实显示了这一点。我发现最好的是几年前在github上请求添加它。知道它是什么时候被添加的吗?@pinkfloydx33:它就在那里,我保证:)无论如何,我再次更新了我的答案,将通用重载也包括在内。我不再否认它的存在,因为我可以在SharpLab上看到它。它也可以在referencesource中找到,但不能在referencesource.microsoft.com上找到。它似乎是netcoreapp1.1中添加的dotnet核心(仅?)。肯定让人困惑的是,它没有列在MSDN上(或者我只是个盲人)