如果您需要地图<condition on xml node
> to <change of state
> 没有办法避免定义该映射某处。这完全取决于您可以对条件做出多少假设以及在这些条件下您会做什么。我认为字典的想法很好。为了提供尽可能多的灵活性,我会这样开始:
Dictionary<Predicate<XmlNode>, Action> mappings;
然后开始尽可能地简化。例如,您是否经常像示例中那样将 wt 设置为 MyEnum 的值?如果是这样,你想要这样的东西:
Func<MyEnum, Action> setWt = val =>
() => wt = val;
对于可能常见的情况,您只需检查属性是否具有特定值,您也需要一些便利:
Func<string, string, Predicate<XmlNode>> checkAttr = (attr, val) =>
node => node.Attributes[attr] == val;
现在您的字典可以包含以下项目:
...
{checkAttr("a", "abc"), setWt(MyEnum.Haze)},
...
这很好又简洁,但也不限于简单<attribute, value
> to <enum
> 映射。好的,现在你有了这些条件-动作对的大字典,你只需说:
foreach(DictionaryEntry<Predicate<XmlNode>, Action> mapping in mappings)
{
if (mapping.Key(xmlNode))
{
mapping.Value();
break;
}
}
如果您避免使用 lambda 语法和字典初始值设定项,您应该能够在 2.0 中做到这一点。