2

我的问题有点像在这里找到的问题: 如何在 C# 中动态命名变量? 但是它有点不同,所以我想知道它是否可能。

我正在尝试从 .settings 文件中读取一堆字符串。我将它们都命名为 Time1、Time2、Time3 等...我希望用户能够向文件中添加更多时间,以便可能有 Time100 或更多。我在设置文件中有一个大小,它将跟踪时间变量的数量。我想写一些能读入所有时间字符串的东西。我认为用 100 个时间变量预先填充 .settings 文件会很愚蠢,所以我知道它们在那里,然后手动读取每个变量。
所以我想知道是否有一种方法可以让我在 Timei 或 Time+i 中读取,其中 I 是一个整数,我可以将其放入一个可以找到它们的循环中。(注意数据是字符串而不是时间,它只是要转换为星期几) 如:(天数来自 ApplicationSettingsBase [aka file add new 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 进行通用查找,然后我可以创建一个动态名称并找到它。你们可能想告诉我如何做到这一点,我只是不明白。

再次感谢所有帮助过的人。

4

4 回答 4

7

我会使用哈希表/字典来存储Days.Default.TimeX变化

hashtable["Time1"]...hashtable["TimeN"]
于 2013-06-11T05:14:15.013 回答
2

另一种选择可能是使用Reflection. 并从动态中获取值enum

请参阅链接:如何在 C# 中使用反射获取枚举值

但是,使用 aDictionary<string, DayOfWeek>将为您提供更好的性能和更易读的代码。

于 2013-06-11T05:19:40.670 回答
2

如前所述,哈希表或字典可能会为您提供最好的服务。如果你走字典路线,你可以在类上创建一个字符串/整数索引器,你可以稍微改变你的代码:

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;
于 2013-06-11T05:30:37.563 回答
0

我认为您可以通过使用 ConfigurationElementCollection实现配置来更好地解决您的问题。那么配置元素的“名称”就无关紧要了。您枚举一组值并直接使用它们。

见这里的例子;如何使用 ConfigurationElementCollection 实现 ConfigurationSection

于 2013-06-11T06:13:47.097 回答