Подтвердить что ты не робот

IsGenericType & IsValueType отсутствует в .Net Core?

У меня есть этот код в .Net 4.6.2 и теперь пытаюсь преобразовать в .Net-ядро, но я получаю ошибку

Ошибка CS1061 "Тип" не содержит определения для "IsGenericType" и никакой метод расширения 'IsGenericType', принимающий первый аргумент тип "Тип" можно найти (если вы не указали директиву или сборка?)

public static class StringExtensions
{
    public static TDest ConvertStringTo<TDest>(this string src)
    {
        if (src == null)
        {
            return default(TDest);
        }           

        return ChangeType<TDest>(src);
    }

    private static T ChangeType<T>(string value)
    {
        var t = typeof(T);

        // getting error here at t.IsGenericType
        if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
        {
            if (value == null)
            {
                return default(T);
            }

            t = Nullable.GetUnderlyingType(t);
        }

        return (T)Convert.ChangeType(value, t);
    }
}

Что эквивалентно в .Net Core?

Update1

Удивительно, когда я отлаживаю код, я вижу, что переменная t имеет свойство IsGenericType, но я не могу использовать IsGenericType в коде. Не знаете, почему или какое пространство имен мне нужно добавить. Я добавил using System и using System.Runtime оба пространства имён

введите описание изображения здесь

4b9b3361

Ответ 1

Да, они перемещаются в .Net Core в новый класс TypeInfo. Способ получить это работает с помощью GetTypeInfo().IsGenericType и GetTypeInfo().IsValueType.

using System.Reflection;

public static class StringExtensions
{
    public static TDest ConvertStringTo<TDest>(this string src)
    {
        if (src == null)
        {
            return default(TDest);
        }           

        return ChangeType<TDest>(src);
    }

    private static T ChangeType<T>(string value)
    {
        var t = typeof(T);

        // changed t.IsGenericType to t.GetTypeInfo().IsGenericType
        if (t.GetTypeInfo().IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
        {
            if (value == null)
            {
                return default(T);
            }

            t = Nullable.GetUnderlyingType(t);
        }

        return (T)Convert.ChangeType(value, t);
    }
}