Estou analisando um arquivo XML com a XmlReader
classe em .NET e pensei que seria inteligente escrever uma função de análise genérica para ler diferentes atributos genericamente. Eu criei a seguinte função:
private static T ReadData<T>(XmlReader reader, string value)
{
reader.MoveToAttribute(value);
object readData = reader.ReadContentAsObject();
return (T)readData;
}
Como pude perceber, isso não funciona inteiramente como planejei; ele lança um erro com tipos primitivos como int
ou double
, uma vez que uma conversão não pode ser convertida de um string
para um tipo numérico. Existe alguma maneira de minha função prevalecer na forma modificada?
Você já experimentou o Convert.ChangeType ?
Se o método sempre retorna uma string, o que eu acho estranho, mas isso está além do ponto, então talvez esse código alterado faria o que você deseja:
fonte
experimentar
fonte
Você pode exigir que o tipo seja um tipo de referência:
E então faça outro que use tipos de valor e TryParse ...
fonte
Na verdade, o problema aqui é o uso de ReadContentAsObject. Infelizmente, esse método não corresponde às suas expectativas; embora deva detectar o tipo mais apropriado para o valor, ele na verdade retorna uma string, não importa o que aconteça (isso pode ser verificado usando o Refletor).
No entanto, no seu caso específico, você já sabe o tipo para o qual deseja fazer a projeção, portanto, eu diria que está usando o método errado.
Tente usar ReadContentAs, é exatamente o que você precisa.
fonte
Você pode provavelmente passar, como um parâmetro, um delegado que converterá de string em T.
fonte
Adicione uma restrição de 'classe' (ou mais detalhada, como uma classe base ou interface de seus objetos T esperados):
ou
where T : IMyInterface
ouwhere T : new()
, etcfonte
Na verdade, as respostas trazem uma questão interessante, que é o que você quer que sua função faça em caso de erro.
Talvez faria mais sentido construí-lo na forma de um método TryParse que tenta ler em T, mas retorna falso se não puder ser feito?
edit: agora que pensei sobre isso, eu realmente preciso fazer o teste convert.changetype? a linha as já não tenta fazer isso? Não tenho certeza se fazer essa chamada de changetype adicional realmente realiza alguma coisa. Na verdade, ele pode apenas aumentar a sobrecarga de processamento, gerando exceção. Se alguém souber de alguma diferença que valha a pena fazer, poste!
fonte