[英]Type initializer threw an exception
此类抛出异常。 它没有显示确切的行号,但听起来像是在静态构造函数中发生的:
static class _selectors
{
public static string[] order = new[] { "ID", "NAME", "TAG" };
public static Dictionary<string, Regex> match = new Dictionary<string, Regex> {
{ "ID", new Regex(@"#((?:[\w\u00c0-\uFFFF-]|\\.)+)") },
{ "CLASS", new Regex(@"\.((?:[\w\u00c0-\uFFFF-]|\\.)+)") },
{ "NAME", new Regex(@"\[name=['""]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['""]*\]") },
{ "ATTR", new Regex(@"\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['""]*)(.*?)\3|)\s*\]") },
{ "TAG", new Regex(@"^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)") },
{ "CHILD", new Regex(@":(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?") },
{ "POS", new Regex(@":(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)") },
{ "PSEUDO", new Regex(@":((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['""]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?") }
};
public static Dictionary<string, Action<HashSet<XmlNode>, string>> relative = new Dictionary<string, Action<HashSet<XmlNode>, string>> {
{ "+", (checkSet, part) => {
}}
};
public static Dictionary<string, Regex> leftMatch = new Dictionary<string, Regex>();
public static Regex origPOS = match["POS"];
static _selectors()
{
foreach (var type in match.Keys)
{
_selectors.match[type] = new Regex(match[type].ToString() + @"(?![^\[]*\])(?![^\(]*\))");
_selectors.leftMatch[type] = new Regex(@"(^(?:.|\r|\n)*?)" + Regex.Replace(match[type].ToString(), @"\\(\d+)", (m) =>
@"\" + (m.Index + 1)));
}
}
}
为什么不能在c'tor中更改这些值?
如果查看内部异常,您将看到它指出
集合已修改; 枚举操作可能无法执行。
这意味着您正在更改要循环的集合,这是不允许的。
而是将构造函数更改为类似
static _selectors()
{
List<string> keys = match.Keys.ToList();
for (int iKey = 0; iKey < keys.Count; iKey++)
{
var type = keys[iKey];
_selectors.match[type] = new Regex(match[type].ToString() + @"(?![^\[]*\])(?![^\(]*\))");
_selectors.leftMatch[type] = new Regex(@"(^(?:.|\r|\n)*?)" + Regex.Replace(match[type].ToString(), @"\\(\d+)", (m) =>
@"\" + (m.Index + 1)));
}
}
简单的诊断方法:将所有代码移入常规方法,然后找出以这种方式抛出的异常。 或者只是在调试器中运行它-抛出异常时应该会中断。
我怀疑这将是一个不好的正则表达式或类似的东西。
就我个人而言,我认为这在静态构造函数中逻辑太多,但这是稍有不同的事情……请注意,您在这里还依赖于初始化的顺序:
public static Regex origPOS = match["POS"];
这是保证好起来的那一刻,但它是非常脆。
您正在枚举集合的同时对其进行修改。 你不能那样做。 快速解决方案是将密钥移到另一个集合中并枚举:
static _selectors()
{
foreach (var type in match.Keys.ToArray())
{
另外,如果您检查了内部异常,就会发现情况确实如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.