VB.NET: проверка того, имеет ли переменная значение Guid? (обнуляемый) тип

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

Dim myGuid As Nullable(Of Guid) or Dim myGuid As Guid?

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

Как узнать, является ли myGuid типом, допускающим значение NULL?


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

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

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


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

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

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

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

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

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


person ingredient_15939    schedule 16.01.2012    source источник
comment
Вместо этого вы могли бы использовать атрибут? Пометьте метод идентификатора настраиваемым атрибутом, чтобы указать, что его следует игнорировать.   -  person MarkJ    schedule 17.01.2012
comment
@MarkJ, класс данных строки - это просто набор общедоступных членов, например. Public ClientFirstName As String. Имя элемента отражает имя столбца базы данных. Есть ли способ добавить специальные атрибуты члену класса в код, к которому затем можно получить доступ через отражение?   -  person ingredient_15939    schedule 17.01.2012
comment
Да, смотрите эти ссылки msdn.microsoft.com/en-us/library/71s1zwct. aspx и msdn.microsoft.com/en-us/library/ z919e8tw.aspx   -  person MarkJ    schedule 17.01.2012
comment
Я также рекомендую изучить фреймворки ORM, такие как NHibernate или Entity Framework, которые могут сделать за вас подготовительную работу.   -  person MarkJ    schedule 17.01.2012
comment
Спасибо @MarkJ, но речь идет об атрибутах, применяемых к классу, тогда как мне нужна информация об отдельном члене, а не о классе.   -  person ingredient_15939    schedule 17.01.2012
comment
Попробуйте этот вопрос   -  person MarkJ    schedule 17.01.2012
comment
Лучше опубликовать свое редактирование как ответ, принять его, чем поместить ответ в вопрос.   -  person LarsTech    schedule 18.01.2012
comment
@LarsTech ой, спасибо, теперь все готово.   -  person ingredient_15939    schedule 18.01.2012


Ответы (3)


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

person Darin Dimitrov    schedule 16.01.2012
comment
@ingredient_15939 ingredient_15939, поскольку вы не можете этого знать, потому что именно так работают типы Nullable, я спрашиваю вас, почему вам нужно это знать, чтобы предоставить вам альтернативный подход. - person Darin Dimitrov; 16.01.2012
comment
@competent_tech, да, я знаю, что они не обнуляются. Но поскольку переменная myGuid объявлена ​​как Nullable(Of Guid), у вас есть только две возможности для нее: либо она может быть нулевой, и в этом случае вы, очевидно, не можете знать ее тип, либо она может быть Guid. В этом был смысл моего ответа. - person Darin Dimitrov; 16.01.2012
comment
@Дарин, не беспокойтесь, я отредактировал вопрос с объяснением. - person ingredient_15939; 16.01.2012

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

object o = new Nullable<Guid>(Guid.NewGuid()); //no longer a nullable guid.
person Magnus    schedule 16.01.2012
comment
Здоровья Магнус. Я обнаружил, что могу сделать это с помощью отражения, и это здорово. - person ingredient_15939; 18.01.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 не может принимать значение Null
intyes не может принимать значение Null
guidno не может принимать значение Null
guidyes не может принимать значение Null

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

person ingredient_15939    schedule 18.01.2012