Pergunta

Meu cenário deve ser simples ... do tipo que quero converter A PARTIR DE é SEMPRE 'corda'. O que eu quero converter para ... pode ser muitas coisas - ints, datetimes, ... strings, etc.

Isso seria fácil:

string valueToConvertFrom = "123";

int blah = Convert.ToInt32(valueToConvertFrom);

No entanto ... eu não sei (até o tempo de execução) que o valor para o qual preciso converter é um 'int' (ou o que seja). Eu tentei o seguinte:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

object blah = Convert.ChangeType(valueToConvertFrom, convertToType);

Mas isso me dá o seguinte erro: "O objeto deve implementar o iconvertible".

Não quero ter que fazer uma instrução SWITCH e chamar "convert.toblah" com base no nome do tipo ... alguma sugestão?

Foi útil?

Solução

A maneira limpa de fazer isso é usar o ACONVERTER A. Você pode obter uma instância de um conversor de tipo chamando o TypeDescriptor.getConverter e depois usando a instância do conversor de tipo para fazer a conversão. Então, algo assim:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);

Outras dicas

A classe String implementa o iconvertible, esse código simplesmente deve funcionar. Qual versão do .NET você está apontando?

object o = Convert.ChangeType( str, convertToType );

Além disso, a maioria dos tipos que você mencionou implementou o método Parse, então sua melhor foto pode ser algo assim.

Type convertToType = ...;
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static);
object blah;
if(mi != null)
{
    blah = mi.Invoke(null, new object[]{valueToConvertFrom});
}
else
{
    // the type doesn't implement the Parse method, handle it another way :/
}

A pergunta de Timothy, aplicada geralmente à questão da conversão de tipo no .NET, é um problema muito grande. Embora as estratégias de conversão sejam um pouco diretas em cenários específicos com tipos conhecidos, infelizmente não existe uma estratégia generalizada em nenhuma implementação do .NET para realizar a conversão do tipo no tempo de execução de um tipo arbitrário para outro, nem é uma estratégia futura de Redmond. No entanto, a Microsoft fornece algumas boas diretrizes para o conceito geral de conversão de tipo, incluindo:

Eu tive que lidar com a mesma questão geral em meus sistemas e, como uma solução, consolidei todas as estratégias padrão em um método. O escopo desta questão é amplo e as estratégias de conversão relacionadas são variadas; portanto, essa abordagem consolidada só pode ser abordada em um artigo técnico completo. No entanto, ofereço aqui uma cópia da minha documentação do meu método, na esperança de que isso ajude você a entender os requisitos gerais que você precisará resolver se desejar desenvolver uma solução generalizada e semelhante. Aqui está o link para minha documentação:

Espero que isso ajude você,

Marca

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top