将对象转换为T

Kas*_*dum 79 c# generics casting

我正在使用XmlReader.NET中的类解析XML文件,我认为编写通用解析函数来一般性地读取不同的属性是明智的.我想出了以下功能:

private static T ReadData<T>(XmlReader reader, string value)
{
    reader.MoveToAttribute(value);
    object readData = reader.ReadContentAsObject();
    return (T)readData;
}
Run Code Online (Sandbox Code Playgroud)

当我意识到,这并不像我原先计划的那样完全有效; 它会引发原始类型(如intor)的错误double,因为强制转换无法从a转换string为数字类型.有没有办法让我的功能以修改后的形式占上风?

Bob*_*Bob 186

首先检查它是否可以投射.

if (readData is T) {
    return (T)readData;
} 
try {
   return (T)Convert.ChangeType(readData, typeof(T));
} 
catch (InvalidCastException) {
   return default(T);
}
Run Code Online (Sandbox Code Playgroud)

  • 我得到“对象必须实现 IConvertible”。 (3认同)
  • 这是正确的答案.但我可以提出一个论点,即try/catch在这里完全是多余的.特别是考虑到静音异常.我认为if(readData是T){...}部分是一个充分的尝试. (2认同)

ang*_*son 17

你试过Convert.ChangeType吗?

如果该方法总是返回一个字符串,我觉得很奇怪,但除此之外,那么这个改变的代码可能会做你想要的:

private static T ReadData<T>(XmlReader reader, string value)
{
    reader.MoveToAttribute(value);
    object readData = reader.ReadContentAsObject();
    return (T)Convert.ChangeType(readData, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)


Sad*_*egh 7

尝试

if (readData is T)
    return (T)(object)readData;
Run Code Online (Sandbox Code Playgroud)