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上(或者我只是个盲人)