Определите, является ли универсальный параметр типом Nullable - PullRequest
22 голосов
/ 03 марта 2011

У меня есть следующая функция VB.NET, например:

Public Function MyFunction (Of TData) (ByVal InParam As Integer) As TData

End Sub

Как в функции определить, является ли TData типом NULLable?

Ответы [ 3 ]

41 голосов
/ 03 марта 2011

Один из способов:

If Nullable.GetUnderlyingType(GetType(TData)) <> Nothing

... по крайней мере, C #:

if (Nullable.GetUnderlyingType(typeof(TData)) != null)

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

if (default(TData) == null)

, но я не уверен, будет ли работать там простой перевод VB, поскольку «Ничто» немного отличается в VB.

6 голосов
/ 03 марта 2011

VB.net:

Dim hasNullableParameter As Boolean = _
        obj.GetType.IsGenericType _
        AndAlso _
        obj.GetType.GetGenericTypeDefinition = GetType(Nullable(Of ))

C #:

bool hasNullableParameter = 
        obj.GetType().IsGenericType && 
        obj.GetGenericTypeDefinition().Equals(typeof(Nullable<>));
1 голос
/ 21 июня 2011

Вы можете использовать код, указанный в этом ответе , добавить расширение

public static bool IsNullable(this Type type) {
    Contract.Requires(type != null);
    return type.IsDerivedFromOpenGenericType(typeof(Nullable<>));
}

и сказать

bool nullable = typeof(TData).IsNullable();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...