VB.NET Получает базовый system.type от nullable типа

matches() вернет true только в том случае, если полная строка соответствует. find() попытается найти следующее вхождение в подстроке, которое соответствует регулярному выражению. Обратите внимание на акцент на «следующий». Это означает, что результат вызова find() несколько раз может быть не таким. Кроме того, с помощью find() вы можете вызвать start(), чтобы вернуть позицию, подстроенную подстрокой.

final Matcher subMatcher = Pattern.compile("\\d+").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + subMatcher.matches());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find());
System.out.println("Found: " + subMatcher.find());
System.out.println("Matched: " + subMatcher.matches());

System.out.println("-----------");
final Matcher fullMatcher = Pattern.compile("^\\w+$").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + fullMatcher.find() + " - position " + fullMatcher.start());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());

Будет выводиться:

Found: false
Found: true - position 4
Found: true - position 17
Found: true - position 20
Found: false
Found: false
Matched: false
-----------
Found: true - position 0
Found: false
Found: false
Matched: true
Matched: true
Matched: true
Matched: true

Итак, будьте осторожны при многократном вызове find(), если объект Matcher не был сброшен, даже когда регулярное выражение окружено с ^ и $, чтобы соответствовать полной строке.

10
задан Rob Cooper 31 August 2008 в 06:34
поделиться

5 ответов

@Mendelt Siebenga: можно только назвать GetType на свойстве значения, если переменная не устанавливается в NULL; иначе Вы получите исключение.

То, что Вы хотите сделать, использовать свойство "GetValueOrDefault" и назвать GetType на этом, так как Вам гарантируют, это не будет пустым. Пример:

Dim i As Nullable(Of Integer) = Nothing
Dim t As Type = i.GetValueOrDefault().GetType()
0
ответ дан 3 December 2019 в 18:37
поделиться

Вот ваш ответ в 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 захлебнется ... У вас может не быть этой проблемы, но моя ситуация чрезвычайно открыта.

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

15
ответ дан 3 December 2019 в 18:37
поделиться

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

1
ответ дан 3 December 2019 в 18:37
поделиться

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

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

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

1
ответ дан 3 December 2019 в 18:37
поделиться
Nullable.GetUnderylingType(myType)

вернет тип, лежащий в основе, или нулевой, если это не нулевой тип.

4
ответ дан 3 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: