Несмотря на то, что ответ @ theCoop верный (в принципе нет ничего неправильного в размещении его кода в теле предоставленного вами метода), здесь есть несколько гигантских ошибок.
Nullable<T>
обрабатывается во время выполнения как «специальный» тип, который имеет очень специфическую семантику. В частности, когда Nullable<T>
в штучной упаковке:
- Если
HasValue == true
, он ведет себя так же, как T
в штучной упаковке, что делает невозможным для кода нижестоящего элемента определить, был ли создан созданный объект путем помещения T
в коробку или Nullable<T>
.
Возможна распаковка на T
и Nullable<T>
.
- Если
HasValue == false
, бокс просто возвращает null
. Распаковка на T
приведет к выбросу, распаковка на Nullable<T>
будет успешной, для чего HasValue == false
.
В любом случае, boxedNullableObject.GetType()
не покажет, что объект был создан боксом Nullable<T>.
. Я не могу думать о каком-либо другом типе значения, который демонстрирует такое странное поведение.
Например, рассмотрим:
// Output: "System.Nullable`1[System.Int32]"
Console.WriteLine(typeof(int?));
object boxedNullableInt32WithValue = new int?(0);
// Output: "System.Int32", NOT "System.Nullable`1[System.Int32]"
Console.WriteLine(boxedNullableInt32WithValue.GetType());
object boxedNullableInt32WithoutValue = new int?();
// NullReferenceException is thrown
Console.WriteLine(boxedNullableInt32WithoutValue.GetType());
Следовательно, написание метода, такого как:
public static bool IsObjectANullableT(this object obj) { ... }
действительно плохая идея.
РЕДАКТИРОВАТЬ : В другой заметке я только что понял, что есть метод каркаса, который делает то, что вам нужно, используя ту же технику, что и образец @ theCoop: Nullable.GetUnderlyingType
.
Использование:
static bool IsNullable(Type type)
{
return Nullable.GetUnderlyingType(type) != null;
}
РЕДАКТИРОВАТЬ : Только что увидел, что @TheCoop также упомянул это в своем ответе. Моя ошибка.