我的问题有点像在这里找到的问题: How do I name variables dynamically in C#? 然而它有点不同所以我想知道它是否可能。
我正在尝试从.settings文件中读取一堆字符串。
我把它们全部命名为Time1,Time2,Time3等......
我希望用户能够向文件添加更多时间,以便可能有Time100或更多。
我在设置文件中有一个大小,可以跟踪时间变量的数量。
我想写一些将在所有Time字符串中读取的内容。我认为用100个时间变量预先填充.settings文件是愚蠢的,所以我知道它们在那里,然后在每个变量中手动读取。
所以我想知道是否有一种方法可以在Timei或Time + i中读取,我是一个整数,我可以放入一个可以找到它们的循环。
(注意数据是字符串而不是时间,它只是转换为星期几)
如:( Days是来自ApplicationSettingsBase [又名文件添加新的Settings1.settings]
public static int AvDaysIndex = Days.Default.Size; //This holds the number of items in Days
public static DayOfWeek[] AvailableDays = new DayOfWeek[AvDaysIndex]; //This is where I wants to read in all the variables Aka Time1 Time2 Times3
public ReadInDays() //Reads in from the .settings File
{
if(AvDaysIndex>0) // Makes sure there is something in Days to read
{
int I=0;
//I can Manually do the following
AvailableDays[I++] = Days.Default.Time1;
AvailableDays[I++] = Days.Default.Time2;
AvailableDays[I++] = Days.Default.Time3; //etc...
//Is there a way to do something like this
for (int i = 0; i < AvDaysIndex; i++) //reads in each time
{
AvailableDays[i] = Days.Default.Time +i;//where I would be added to the variable name to find it?
//Or something like
AvailableDays[i] = Days.Default.Time(I.tostring())
}
}
}
希望所有这一切至少能说清楚我正在做什么。
编辑 - 我开始认为我的问题实际上是.settings文件。如果我只是从其他值没有名称的文件类型中读取值,即使文件中有可变数量的元素,我也可以轻松读取它们。
解决方案 -
for (int i = 0; i < Index; i++)
{
AvailableDays[i] = getFromFile(_Days.Default.Properties["Time" + (i+1).ToString()].DefaultValue.ToString());
AvailableTimes[i] = Convert.ToDateTime(_Times.Default.Properties["Time" + (i + 1).ToString()].DefaultValue);
}
一直在想弄清楚如何从.settings文件中读取,而不是直接读取它。也就是Days.Default.Time1;我不得不从Days.Default.Properties进行通用查找,然后我可以创建一个动态名称并找到它。你们可能想告诉我怎么做,我只是不明白。
再次感谢所有帮助过的人。
答案 0 :(得分:6)
我会使用散列表/字典来存储Days.Default.TimeX
变体
hashtable["Time1"]...hashtable["TimeN"]
答案 1 :(得分:2)
另一种选择可能是使用Reflection
。并且即时获取enum
的值。
请参阅链接:How to Get Enum Values with Reflection in C#
但是,使用Dictionary<string, DayOfWeek>
可以提供更好的性能和更易读的代码。
答案 2 :(得分:2)
如前所述,散列表或字典可能会为您提供最佳服务。如果你去字典路线,你可以在类上创建一个字符串/ int索引器,你可以稍微改变你的代码:
http://msdn.microsoft.com/en-us/library/2549tw02%28v=vs.80%29.aspx - 在类上创建索引器的示例:
示例索引器类:
public class Default
{
private Dictionary<int, DayOfWeek> _values = new Dictionary<int,DayOfWeek>();
public DayOfWeek this[int index]
{
get
{
if (_values.ContainsKey(index))
return _values[index];
else
return null;
}
set
{
_values[index] = value;
}
}
}
原件:
AvailableDays[i] = Days.Default.Time(I.tostring())
会变成:
AvailableDays[i] = Days.Default.Time[I];
反射也总是一个选项,我在下面有一个示例,它位于Windows控制台应用程序中:
public class Default
{
public int Time1 { get; set; }
public int Time2 { get; set; }
public int Time3 { get; set; }
}
class Program
{
static void Main(string[] args)
{
Default d = new Default();
Type t = d.GetType();
foreach (var info in t.GetProperties())
{
//SET VALUE
info.SetValue(d, 1);
}
foreach (var info in t.GetProperties())
{
//GET VALUE
Console.WriteLine("Property: {0}", info.Name);
Console.WriteLine("Value: {0}", info.GetValue(d));
}
//OR JUST ONE PROPERTY
Console.WriteLine("Time1 Property Value: {0}", t.GetProperty("Time1").GetValue(d));
Console.ReadLine();//PAUSE THE CONSOLE AFTER PROCESSING
}
}
在使用反射的示例中:
Days.Default.GetType().GetProperty("Time" + I.ToString()).GetValue(Days.Default) as DayOfWeek;
答案 3 :(得分:0)
我认为您可以通过使用a实现配置来更好地解决问题 ConfigurationElementCollection。然后配置元素的“名称”无关紧要。您枚举一组值并直接使用它们。
见这里的例子; How to implement a ConfigurationSection with a ConfigurationElementCollection