web-dev-qa-db-ja.com

IsGenericType&IsValueTypeが.Net Coreにありませんか?

.Net 4.6.2にこのコードがあり、.Netコアに変換しようとしていますが、エラーが発生します

エラーCS1061 'Type'には 'IsGenericType'の定義が含まれておらず、タイプ 'Type'の最初の引数を受け入れる拡張メソッド 'IsGenericType'が見つかりません(usingディレクティブまたはアセンブリ参照がありませんか?)

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

驚いたことに、コードをデバッグすると、変数tIsGenericTypeプロパティがありますが、コードでIsGenericTypeを使用できません。追加する必要がある理由または名前空間がわからない。私が追加しました using Systemおよびusing System.Runtime両方の名前空間

enter image description here

23
LP13

はい、それらは.NetCoreで新しいTypeInfoクラスに移動されます。これを機能させる方法は、GetTypeInfo().IsGenericTypeGetTypeInfo().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);
    }
}
36
Venky