我目前有一个项目,我在c#中使用枚举。
此刻它看起来像这样。 。
public enum Temp
{
CAREA = 10,
CAREB = 20,
CAREC = 22,
CARED = 35
}
然而,我想从.txt文件或.xml文件中调用相同的数据(作为枚举)。要么会这样做。这是为了在每次我必须在枚举中添加另一个条目时保存重新构建(这经常发生) - 编辑.txt或.xml文件要容易得多。
答案 0 :(得分:3)
我建议您使用字典,而不是使用在运行时动态更改的枚举。
class MyClass
{
private Dictionary<string, int> tempValues = new Dictionary<string, int>() {
{ "CAREA", 10 },
{ "CAREB", 20 },
{ "CAREC", 22 },
{ "CARED", 35 }
}
public Dictionary<string, int> TempValues
{
get
{
return this.tempValues
}
}
}
您仍然需要从文件中加载值并填充它们:
private void ReadValues(string path)
{
foreach(string line in File.ReadAllLines(path))
{
string[] tokens = string.Split(',');
string key = tokens[0];
int value = int.Parse(tokens[1]);
// TODO: check if key does not already exist
this.tempValues.Add(key, value);
}
}
您的输入文件需要如下所示:
CAREA,10
CAREB,20
CAREC,22
CARED,35
答案 1 :(得分:2)
C#中的枚举是一组命名常量。如果您从数据源动态生成不同的值,则这些值将不再是常量。听起来Dictionary更适合你的情况。
答案 2 :(得分:1)
改为使用字典:
var myEnums = new Dictionary<string, int>();
public void ReadIt()
{
// Open your textfile into a streamreader
using (System.IO.StreamReader sr = new System.IO.StreamReader("text_path_here.txt"))
{
while (!sr.EndOfStream) // Keep reading until we get to the end
{
string splitMe = sr.ReadLine(); //suppose key and value are stored like "CAREA:10"
string[] keyValuePair = splitMe.Split(new char[] { ':' }); //Split at the colons
myEnums.Add(keyValuePair[0], (int)keyValuePair[1]);
}
}
}
答案 3 :(得分:0)
你将无法做到这一点。枚举的值(CAREA
,CAREB
等)必须在编译时可用。
但是,您可以做的是在代码中提供所有值,并解析纯文本或XML文件支持的内容。您可以使用以下扩展方法。
/// <summary>
/// Converts the string to a specified enumeration.
/// A value specifies whether the operation is case-insensitive.
/// </summary>
/// <typeparam name="TEnum">The type of System.Enum to parse as.</typeparam>
/// <param name="value">The System.String value.</param>
/// <param name="ignoreCase"><c>true</c> to ignore case; <c>false</c> to regard case.</param>
/// <exception cref="ArgumentNullException"><paramref name="value"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentException"><paramref name="value"/> does not map to one of the named constants defined in <typeparamref name="TEnum"/>.</exception>
public static TEnum ParseAs<TEnum>(this String value, bool ignoreCase)
where TEnum : struct
{
return (TEnum)Enum.Parse(typeof(TEnum), value, ignoreCase);
}
用法:
var enumValue = "CAREA".ParseAs<Temp>(ignoreCase: false);