Как преобразовать необнуляемый тип в обнуляемый тип? - PullRequest
3 голосов
/ 20 октября 2011

Можно ли преобразовать ненулевой тип значения, известный только во время выполнения, в нулевой?Другими словами:

public Type GetNullableType(Type t)
{
    if (t.IsValueType)
    {
        return typeof(Nullable<t>);
    }
    else
    {
        throw new ArgumentException();
    }
}

Очевидно, что строка return выдает ошибку.Есть ли способ сделать это?Метод Type.MakeGenericType кажется многообещающим, но я понятия не имею, как получить неуказанный универсальный объект Type, представляющий Nullable<T>.Есть идеи?

Ответы [ 4 ]

8 голосов
/ 20 октября 2011

Вы хотите typeof(Nullable<>).MakeGenericType(t)

Примечание: Nullable<> без любые предоставленные аргументы являются несвязанным универсальным типом; для более сложных примеров вы должны добавить запятые для соответствия - то есть KeyValuePair<,>, Tuple<,,,> и т. д.

4 голосов
/ 20 октября 2011

Вы на правильном пути.Попробуйте это:

if (t.IsValueType)
{
    return typeof(Nullable<>).MakeGenericType(t);
}
else
{
    throw new ArgumentException();
}
1 голос
/ 20 октября 2011
Type GetNullableType(Type type) {
    // Use Nullable.GetUnderlyingType() to remove the Nullable<T> wrapper
    // if type is already nullable.
    type = Nullable.GetUnderlyingType(type);
    if (type.IsValueType)
        return typeof(Nullable<>).MakeGenericType(type);
    else
        return type;
} 
0 голосов
/ 30 июня 2017

Самое простое решение - вернуть UnderlyingSystemType первого из GenericTypeArguments.Так в этом примере, Nullable Datetime?возвращается как тип свойства, и мне нужно преобразовать его в тип Datetime, чтобы его можно было добавить в DataTable.Это должно работать с Int?и двойной?и т. д.

if (Nullable.GetUnderlyingType(prop.PropertyType) != null) {
  tb.Columns.Add(prop.Name, prop.PropertyType.GenericTypeArguments.First().UnderlyingSystemType);
} else {
  tb.Columns.Add(prop.Name, prop.PropertyType);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...