2016-08-26 3 views
20

Ich habe diesen Code in .Net 4.6.2 und nun versucht, in .Net Kern zu konvertieren aber ich bin immer FehlerIsGenericType & IsValueType fehlt von .Net Core?

Fehler CS1061 ‚Typ‘ enthält keine Definition für ‚IsGenericType‘ und ohne Erweiterung enthält Methode ‚IsGenericType‘ ein erstes Argument von Typ ‚Typ‘ die Annahme gefunden werden (möglicherweise fehlt eine using-Direktive oder ein Montage Referenz?)

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); 
    } 
} 

Was in .Net-Core entspricht?

Update1

Überraschenderweise wenn ich den Code debuggen Ich sehe Variable t hat IsGenericType Eigenschaft jedoch kann ich nicht IsGenericType im Code verwenden. Nicht sicher, warum oder welchen Namespace ich hinzufügen muss. Ich habe using System und using System.Runtime beiden Namensräume hinzugefügt

enter image description here

Antwort

30

Ja, sie sind in .Net-Core zu einer neuen Klasse TypeInfo bewegt. Der Weg, um dies zu erreichen, ist mit 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); 
    } 
} 
+2

@svick Ist 'GetTypeInfo()' Erweiterung Methode in einem anderen Namespace? intelissense kann es nicht finden – LP13

+4

Nicht sicher, warum fragst du mich, aber ja, es ist in 'System.Reflection'. – svick