Есть ли лучший / лучший способ определить тип передаваемого объекта в VB.NET? - PullRequest
0 голосов
/ 19 мая 2009

Я все еще разрабатываю эту функцию, но вот что я намерен сделать. Эта функция примет объект, затем попытается определить его тип. Есть определенный набор типов, которые я ищу: Integer, Boolean, Date, String. То, что у меня есть, довольно приватно, но, похоже, работает до сих пор:

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

Ответы [ 3 ]

4 голосов
/ 19 мая 2009

Я бы предложил использовать TypeOf вместо Parse или TryParse

  If  TypeOf entry Is Integer Then ...
2 голосов
/ 19 мая 2009

Вам нужно решить, примете ли вы "42" как целое число. Тип объекта по-прежнему String!

Try-блоки и дополнительная проверка с помощью IsNumeric могут быть удалены в любом случае - просто используйте TryParse-Functions

    Dim IntResult As Integer

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

Когда типы можно проверять во время компиляции, вы можете использовать перегрузку параметров.

0 голосов
/ 19 мая 2009

Я разработчик на C # и не до конца понимаю ваш код, но я бы использовал словарь для сопоставления типа объекта и чего-то еще - я предполагаю, что вы возвращаете значение enum. Вот пример C #. В реальном коде словарь не должен быть построен на каждом вызове метода.

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()];
    }
}

У меня был второй взгляд, и похоже, что вы пытаетесь определить тип информации, хранимой в строке, путем ее синтаксического анализа - в этом случае приведенное выше не поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...