[编辑:我在这个问题中添加了很多细节,以便更清楚为什么我需要通过引用传递枚举器]
我正在编写一些代码来解析由命令和参数组成的列表。并非所有命令都具有相同数量的参数。例如,列表可能是 -
command1,
100,
command2,
54,
42,
71,
command3,
10,
31,
command1,
82,
command3,
102,
87
(请注意,某些命令可能具有非整数参数)
我正在使用 List 枚举器遍历数据列表。每个命令都有自己的类,能够从列表中解析命令的参数(并执行与该命令相关的一系列其他活动,这些活动在此缩减示例中不需要)。
我有一本字典,将命令连接到它们的类 -
var map = new Dictionary<string, Type>
{
{ "command1", typeof(Command1Class) },
{ "command2", typeof(Command2Class) },
{ "command3", typeof(Command3Class) },
};
所以我的基本解析循环如下 -
var enumerator = data.GetEnumerator();
while (enumerator.MoveNext())
{
var command = (string)enumerator.Current;
codeBlock.AddBlock((Block)Activator.CreateInstance(map[command], new object[] { enumerator }));
}
(所有命令类都派生自相同的基本类型 Block)
因此,在每个命令类的构造函数中,它可以解析该命令需要多少个参数,并且在返回主循环时,枚举器将继续遍历这些参数。
例如 -
class Command1Class : Block
{
string param;
public Command1Class(ref List<object>.Enumerator enumerator)
{
enumerator.MoveNext();
param = (string)enumerator.Current;
}
}
但是我发现枚举器仅在构造函数中本地修改。因此,在从构造函数返回时,枚举器仍然指向命令,而不是继续遍历该命令需要多少参数。
如果我使用以下样式以非动态方式执行此操作,它会按预期工作,枚举器从构造函数返回时指向下一个命令 -
new SomeClass(ref enumerator)
所以我想知道为什么我的 CreateInstance 代码没有按预期工作,我怎么能动态地做到这一点?