VB.NET: проверка, если переменная имеет Guid? (обнуляемый) тип - PullRequest
0 голосов
/ 16 января 2012

Я пытаюсь проверить, была ли переменная определена как обнуляемый Guid. например.

Dim myGuid As Nullable(Of Guid) или Dim myGuid As Guid?

Кажется, выполнение myGuid.GetType возвращает базовый тип , то есть тип Guid, а не Guid ?. Таким образом, проверка myGuid.GetType Is GetType(Guid?) всегда возвращает False.

Как узнать, является ли myGuid обнуляемым типом?


Ред .: Я могу сделать следующее, что правильно возвращает True для "Guid?" и False для "Guid":

Not Nullable.GetUnderlyingType(GetType(Guid?)) Is Nothing

Проблема в том, что я не знаю, как извлечь обнуляемый тип из самой переменной, чтобы протестировать ее. Мне удалось получить только базовый (не обнуляемый) тип системы.


Ред .: Объяснение, почему мне нужно знать. :)

Я написал вспомогательную функцию БД. Я передаю ему объект, состоящий из открытых членов, представляющих данные строки таблицы. Членами являются столбцы таблицы.

Используя отражение, я зацикливаюсь на этих открытых членах, чтобы создать оператор INSERT для объекта команды и заполнить его параметры значениями в этих членах. Пока все хорошо.

Но теперь есть таблица, в которой есть столбец uniqueidentifier, который я должен не заполнять из объекта строки, поскольку по умолчанию он равен "NEWID ()" (с использованием SQL Server 2008). Вместо того, чтобы пропустить все столбцы Guid, что было бы легко, я хочу пропустить только те, которые определены в классе данных строки как «Guid» (не обнуляемый).

В основном, я использую Guid? (Обнуляемый) тип, чтобы указать, что можно заполнить этот столбец uniqueidentifier данными. Если это не обнуляемое значение, это говорит мне, чтобы пропустить это, потому что у столбца есть значение по умолчанию NEWID ().

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

Ответы [ 3 ]

1 голос
/ 16 января 2012

Тебе действительно все равно, если это Nullable(Of Guid). Вас должно волновать, если это null или Guid, которые являются двумя возможными состояниями.

0 голосов
/ 18 января 2012

Нашли решение! Кажется, невозможно определить, может ли переменная сама по себе обнуляться, но, пока она является членом класса, отражение может использоваться следующим образом:

Класс:

Public Class testclass
  Public intno As Int16
  Public intyes As Int16?
  Public guidno As Guid
  Public guidyes As Guid?
End Class

Код:

Dim oTest As New testclass
For Each f As Reflection.FieldInfo In oTest.GetType.GetFields
  Console.Write(f.Name & " is ")
  If f.FieldType.IsGenericType AndAlso f.FieldType.GetGenericTypeDefinition() Is GetType(Nullable(Of )) Then
    Console.WriteLine("Nullable")
  Else
    Console.WriteLine("Not Nullable")
  End If
Next

Выход:

intno не обнуляется
intyes is Nullable
guidno не Nullable
Guidyes Nullable

Спасибо всем за ваши ответы.

0 голосов
/ 16 января 2012

Объекты, основанные на обнуляемых типах, упаковываются в базовый тип, если они имеют значение, равное пустой ссылке.

object o = new Nullable<Guid>(Guid.NewGuid()); //no longer a nullable guid.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...