【发布时间】:2016-02-24 04:20:50
【问题描述】:
我正在尝试编写一个类来将带有值字符串的 XML 配置文件解析为相应的值和类型。配置的示例条目是:
<ConfigItem Name="ParameterName" Value="1.3" Type="Double"/>
我现在想写一个函数来解析我的值,这样我就可以做这样的事情:
double value = GetItemValue("//ConfigItem[@Name='ParameterName']");
最初我尝试使用其返回类型重载GetItemValue,但这在 C# 中是不可能的。我现在尝试使用通用函数,这样我就可以做到:
double value = GetItemValue<double>("//ConfigItem[@Name='ParameterName']");
我尝试写的函数是这样的:
public T GetItemValue<T>(string configName)
{
list = XmlConfig.SelectNodes(configName);
T returnValue;
if (T.TryParse(list[0].Attributes["Value"].Value, out returnValue))
return returnValue;
else
throw new InvalidProgramException("Could not parse: " + configName);
}
不幸的是,这不起作用,我收到以下错误:
Error CS0119 'T' is a type parameter, which is not valid in the given context
我不确定问题出在哪里,但我怀疑,这与编译时不清楚的事实有关,是否所有类型T 都会有方法TryParse。我尝试使用 where T : Int, Double 之类的约束来解决此问题,但 C# 约束不支持 ValueTypes。
那么问题是什么,我该如何实现,我想要做什么?请注意任何建议,将来我还必须为 T 自定义类型。
【问题讨论】:
-
如果您将
int.TryParse()用于您的T.TryParse()方法,则可能有错误。int.TryParse()使用为当前系统文化初始化的 NumberFormatInfo 对象中的格式信息解析数字。 但是,XML 通常是独立于文化的。我建议使用与文化无关的方法,或来自XmlConvert的方法。