Existe uma melhor maneira melhor / para determinar o tipo de um objeto passado em VB.NET?

votos
0

Eu ainda estou desenvolvendo essa função, mas aqui é o que eu estou pretendendo que ele faça. Esta função irá aceitar um objeto, em seguida, tentar determinar seu tipo. Há um conjunto específico de tipos que eu estou procurando: Integer, Boolean, Date, String. O que eu tenho até agora é muito privativo, mas parece estar funcionando até agora:

Private Function DataType(ByVal entry As Object) As ValueType
    Try
        If IsNumeric(entry) Then
            If Integer.Parse(entry) Then
                Return ValueType.Number
            End If
        End If
    Catch
    End Try

    Try
        If Boolean.Parse(entry) Then
            Return ValueType.Boolean
        End If
    Catch
    End Try

    Try
        If Not Date.Parse(entry) = Nothing Then
            Return ValueType.Date
        End If
    Catch
    End Try

    Return ValueType.Text
End Function
Publicado 19/05/2009 em 17:11
fonte usuário
Em outras línguas...                            


3 respostas

votos
4

Sugiro usar TypeOf em vez de Parse ou TryParse

  If  TypeOf entry Is Integer Then ...
Respondeu 19/05/2009 em 17:16
fonte usuário

votos
2

Você terá que decidir se você vai aceitar "42"ser um inteiro. O tipo de objeto é ainda String!

Os try-blocos e verificação adicional com IsNumericpode ser removido de qualquer maneira - basta usar o TryParse-Funções

    Dim IntResult As Integer

    If Integer.TryParse("42", IntResult) Then
        ' Parsing succeeded - Result is stored in IntResult '
    Else
        ' Failed! '
    End If

Quando os tipos podem ser verificados em tempo de compilação, você poderia usar a sobrecarga de parâmetro.

Respondeu 19/05/2009 em 17:18
fonte usuário

votos
0

Eu sou um desenvolvedor C # e eu não totalmente Unterstand seu código, mas eu gostaria de usar um dicionário para mapear entre o tipo de um objeto e algo mais - eu suponho que você retornar um valor enum. Aqui está um exemplo C #. No código real, o dicionário provavelmente não deve ser construído em cada chamada de método.

public enum ValueType
{
    Unknown, Number, Boolean, Date, String
}

public static ValueType DataType(Object o)
{
    Dictionary<Type, ValueType> map =
        new Dictionary<Type, ValueType>
            {
                {typeof (Int32), ValueType.Number},
                {typeof (Int64), ValueType.Number},
                {typeof (Decimal), ValueType.Number},
                {typeof (Single), ValueType.Number},
                {typeof (Double), ValueType.Number},
                {typeof (Boolean), ValueType.Boolean},
                {typeof (DateTime), ValueType.Date},
                {typeof (String), ValueType.String}
            };

    if ((o == null) || (!map.ContainsKey(o.GetType())))
    {
        return ValueType.Unknown;
    }
    else
    {
        return map[o.GetType()];
    }
}

Eu tinha um segundo olhar e parece que você está tentando determinar o tipo de informação armazenada em uma corda por analisá-lo - neste caso, o acima não vai ajudar.

Respondeu 19/05/2009 em 17:36
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more