VB.NET Получить базовый system.type из обнуляемого типа - PullRequest
10 голосов
/ 31 августа 2008

Я пытаюсь создать набор данных на основе свойств объекта. Например, у меня есть экземпляр класса Person со свойствами, включая ID, имя, фамилию, DOB и т. Д. Используя отражение, я добавляю столбцы в новый набор данных на основе свойств объекта:

For Each pi As PropertyInfo In person.GetType().GetProperties()
    Dim column As New DataColumn(pi.Name, pi.PropertyType)
    table.Columns.Add(column)
Next

Моя проблема в том, что некоторые из этих свойств являются обнуляемыми типами, которые не поддерживаются наборами данных. Есть ли способ извлечь базовый тип системы из обнуляемого типа?

Спасибо.

Ответы [ 5 ]

15 голосов
/ 15 апреля 2009

Вот ваш ответ в VB. Это может быть излишним для ваших целей, но также может быть полезно для некоторых других людей.

Прежде всего, вот код, чтобы выяснить, имеете ли вы дело с типом Nullable:

Private Function IsNullableType(ByVal myType As Type) As Boolean
    Return (myType.IsGenericType) AndAlso (myType.GetGenericTypeDefinition() Is GetType(Nullable(Of )))
End Function

Обратите внимание на необычный синтаксис в GetType. Необходимо. Просто выполнение GetType (Nullable), как предложил один из комментаторов, не сработало для меня.

Итак, вооружившись этим, вы можете сделать что-то вроде этого ... Здесь, в инструменте ORM, я пытаюсь преобразовать значения в общий тип, который может быть или не иметь значение Nullable:

If (Not value Is Nothing) AndAlso IsNullableType(GetType(T)) Then
    Dim UnderlyingType As Type = Nullable.GetUnderlyingType(GetType(T))
    Me.InnerValue = Convert.ChangeType(value, UnderlyingType)
Else
    Me.InnerValue = value
End If

Обратите внимание, что я проверяю Ничто в первой строке, потому что Convert.ChangeType захлебнется ... Возможно, у вас нет этой проблемы, но моя ситуация чрезвычайно открыта.

Надеюсь, если я не отвечу на ваш вопрос напрямую, вы можете отнять это и получить то, что вам нужно - но я только что реализовал это несколько минут назад, и мои тесты все проходят.

4 голосов
/ 08 января 2010
Nullable.GetUnderylingType(myType)

вернет базовый тип или ноль, если это не обнуляемый тип.

1 голос
/ 04 сентября 2008

Вы также можете использовать метод GetGenericParameters() для этого типа. myNullableObject.GetType().GetGenericParameters()[0] должен дать вам тип, который можно обнулить (например, Guid, Int32 и т. Д.)

1 голос
/ 31 августа 2008

Я предполагаю, что проблема в том, чтобы узнать, является ли свойство обнуляемым или нет. В C # вы делаете это с помощью этого кода:

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))

... но я не уверен, что эквивалент этого последнего предложения в VB.NET.

0 голосов
/ 04 сентября 2008

@ Мендель Зибенга: Вы можете вызывать GetType только для свойства value, если переменная не установлена ​​в null; в противном случае вы получите исключение.

Что вы хотите сделать, так это использовать свойство «GetValueOrDefault» и вызвать для него GetType, поскольку вы гарантированно не будете иметь значение null Пример:

Dim i As Nullable(Of Integer) = Nothing
Dim t As Type = i.GetValueOrDefault().GetType()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...