Você tem várias opções:
(int)
- Operador de elenco. Funciona se o objeto já for um número inteiro em algum nível na hierarquia de herança ou se houver uma conversão implícita definida.
int.Parse()/int.TryParse()
- Para converter de uma sequência de formato desconhecido.
int.ParseExact()/int.TryParseExact()
- Para converter de uma string em um formato específico
Convert.ToInt32()
- Para converter um objeto de tipo desconhecido. Ele usará uma conversão explícita e implícita ou implementação IConvertible, se houver alguma definida.
as int?
- Note o "?". O as
operador é apenas para tipos de referência e, portanto, usei "?" para significar a Nullable<int>
. O as
operador " " funciona como Convert.To____()
, mas pense em TryParse()
vez de Parse()
: retorna em null
vez de lançar uma exceção se a conversão falhar.
Destes, eu preferiria (int)
se o objeto realmente fosse apenas um número inteiro em caixa. Caso contrário, useConvert.ToInt32()
neste caso.
Observe que esta é uma resposta muito geral : quero chamar a atenção para a resposta de Darren Clark porque acho que ele faz um bom trabalho abordando os detalhes aqui, mas chegou tarde e ainda não foi votado. De qualquer forma, ele recebe meu voto para "resposta aceita" por também recomendar (int), por apontar que, se falhar, (int)(short)
pode funcionar e por recomendar que você verifique seu depurador para descobrir o tipo de tempo de execução real.
O elenco
(int) myobject
deve funcionar.Se isso der uma exceção de conversão inválida, provavelmente é porque o tipo de variante não é VT_I4. Minha aposta é que uma variante com VT_I4 seja convertida em um int em caixa, VT_I2 em um short em caixa, etc.
Ao fazer uma conversão em um tipo de valor em caixa, é válido apenas convertê-lo no tipo em caixa. Por exemplo, se a variante retornada for realmente um VT_I2,
(int) (short) myObject
deverá funcionar.A maneira mais fácil de descobrir é inspecionar o objeto retornado e dar uma olhada no seu tipo no depurador. Verifique também se no assembly de interoperabilidade você tem o valor de retorno marcado com
MarshalAs(UnmanagedType.Struct)
fonte
Convert.ToInt32 (myobject);
isso tratará do caso em que myobject é nulo e retorna 0, em vez de gerar uma exceção.
fonte
ToInt32
.Use da
Int32.TryParse
seguinte maneira.fonte
Estou listando a diferença em cada uma das formas de elenco. Que tipo específico de fundição manipula e não funciona?
fonte
Talvez Convert.ToInt32 .
Cuidado com a exceção, em ambos os casos.
fonte
fonte
Convert.ChangeType
. Eu diria que pode não ser a resposta perfeita para o OP, mas é definitivamente útil para alguns!Há também TryParse .
Do MSDN:
fonte
Estranho, mas a resposta aceita parece errada sobre o elenco e o Convert, pois nos meus testes e na leitura da documentação também não devemos levar em consideração operadores implícitos ou explícitos.
Portanto, se eu tiver uma variável do tipo objeto e a classe "box" tiver alguns operadores implícitos definidos, eles não funcionarão.
Em vez disso, outra maneira simples, mas realmente o custo do desempenho, é converter antes em dinâmico.
(int) (dinâmico) myObject.
Você pode experimentá-lo na janela interativa do VS.
fonte
dynamic
está longe de ser livrefonte