构建了一个自定义 IDataReader,它在 XML 中查找与特定元素名称匹配的值,如果找到,则返回这些值。GetValue 函数——它必须返回一个由接口指定的对象,如下所示:
public object GetValue(int i)
{
string SearchString = _columns[i];
var searchedAttributeValue = from nm in _el.Attributes(SearchString) select nm;
if (searchedAttributeValue.Count() > 0)
{
return ParseTypes(searchedAttributeValue.First().Value);
}
var searchedElementValue = from nm in _el.Elements(SearchString) select nm;
if (searchedElementValue.Count() > 0)
{
return ParseTypes(searchedElementValue.First().Value);
}
}
显然,这不会构建,因为在没有有效返回的情况下可能会到达函数的末尾。
在这种情况下,如果发生这种情况,则意味着存在配置错误 - 用户正在寻找 XML 中不存在的元素或属性。
我发现(这对我来说是新的)你可以通过这样做来解决这个问题:
public object GetValue(int i)
{
if (_el == null)
{
_el = XNode.ReadFrom(_reader) as XElement;
}
string SearchString = _columns[i];
var searchedAttributeValue = from nm in _el.Attributes(SearchString) select nm;
if (searchedAttributeValue.Count() > 0)
{
return ParseTypes(searchedAttributeValue.First().Value);
}
var searchedElementValue = from nm in _el.Elements(SearchString) select nm;
if (searchedElementValue.Count() > 0)
{
return ParseTypes(searchedElementValue.First().Value);
}
throw new Exception("oh crap!");
}
所以这个函数不会返回,它只是抛出一个错误。
但是,这种方法从根本上感觉有些错误。可以吗,为什么可以/不可以,是否有更好的方法来处理这种情况?