我正在尝试解决一个简单的解析问题,我选择使用枚举来编码选项列表。
输入数据是直接的ascii文本,分为具有唯一标头的块和数据所在的非唯一标识符。我能够编写非常通用的符号化方法,而不提供数据含义的任何上下文,并在返回后处理它。
使用字符串执行此操作是没有问题的。我只是通过一个List而去。我们去了。
我无法弄清楚枚举枚举的语法,我可以使用一些帮助。我也可能太过于陷入命令式思考,并且错过了一个简单的答案。
这是代码,我很难用
private void parseToEnums(Enum returnEnum, string searchBlock, string startIDText,
string endIDText, string startText, string endText)
{
string ourSearchBlock = searchBlock;
int endIDidx = ourSearchBlock.IndexOf(endIDText);
while (ourSearchBlock.IndexOf(startText) != -1)
{
if (ourSearchBlock.Length == searchBlock.Length)
{
// first pass, trim off the region where the start text isn't valid
ourSearchBlock = ourSearchBlock.Remove(endIDidx, ourSearchBlock.Length - endIDidx);
// first pass, use the startIDtext to create a valid search zone
// BROKEN CODE HERE
// Neither GetType() nor typeof seem to do the right thing
// I have tried several varieties and have tried casting the LHS in the
// same sort of way
// pluckText returns a string that is guaranteed to match an enum name
returnEnum = (returnEnum.GetType()) System.Enum.Parse(typeof(returnEnum), pluckText(ourSearchBlock, startIDText, startText, endText), false);
ourSearchBlock = ourSearchBlock.Remove(0, ourSearchBlock.IndexOf(startIDText) + startIDText.Length);
}
else
{
// this would be similar to the above after it's working
// and is for the case where the string has multiple matches
// within the enum, ie "red white"
//returnList.Add(pluckText(ourSearchBlock, "", startText, endText));
}
ourSearchBlock = ourSearchBlock.Remove(0, ourSearchBlock.IndexOf(startText) + startText.Length);
}
return;
}
我在做什么
private enum Colors { red, white, green };
private enum Suits { spades, clubs, hearts, diamonds };
// ... open files, read data, etc
// so I pass in the enum that I want my result in and some text identifiers
parseToEnum ( Colors, searchBlock, "startColorBlock", "endColorBlock", "id=" );
parseToEnum ( Suits, searchBlock, "startCardSuitsBlock", "endCardSuitsBlock", "<id=" );
// ...
所以我的想法是使用相同的结构(因为输入是相同的),但输出使用不同的枚举。
我知道我需要在此代码中添加一些try / catch包装器和一般错误检测,然后再过长。
答案 0 :(得分:9)
我将忽略所有搜索,并专注于将string
转换为enum
。
首先,我认为你的方法应返回结果,而不是将其作为参数传递(你需要out
)。
其次,要将枚举的类型传递给方法,您可以使用类型为Type
的参数,或者更好的是,使方法通用并将类型作为类型参数传递。
该方法可能如下所示:
T ParseEnum<T>(string s)
{
return (T)Enum.Parse(typeof(T), s, false);
}
然后您可以这样称呼它:
Colors color = ParseEnum<Colors>(someString);
代码中的错误是:
Enum
是所有enum
的公共基本类型,它不代表enum
的类型。这意味着您不能使用例如Colors
作为方法的参数。(foo.GetType())bar
这样的代码永远不会有用。typeof
运算符来获取变量的类型。您可以使用它来获取某些特定类型的Type
对象,例如typeof(string)
或typeof(T)
在类型参数为T
的通用方法中。enum
s)应该是单数。这是因为例如Color
类型的变量代表一个颜色。虽然这只是一个样式问题,但它不会阻止您的代码工作。但它会让你的代码更难理解。