2017-11-29 19 views
1

Ich arbeite an einer switch-Anweisung mit Typprüfung. Der folgende Code funktioniert für alle Typen einwandfrei, die Herausforderung besteht jedoch bei Nullable-Typen.Warum der GetType von DateTime kein konstanter Wert ist

switch (Type.GetTypeCode(propertyInfos.PropertyType)) 
        { 
         // Type code doesn't have reference with int, long, etc., 
         case TypeCode.DateTime: 
          // Do the work for DateTime 
          break; 
         case TypeCode.Int32 : 
          // Do the work for Int32 
          break; 
         case TypeCode.Int64: 
          // Do the work for long 
          break; 
         case TypeCode.DateTime? : 
          break; 
         default: 
          break; 
        } 

Ich habe das versucht, so GetType zu ändern und DateTime.Today.GetType().ToString() würde uns System.DateTime als String zurück. Aber wenn der Compiler verwendet wird, löst er einen Fehler aus, da dies kein gültiger Constant string ist. Zu jedem gegebenen Zeitpunkt, DateTime.Today.GetType() würde uns immer System.DateTime geben, warum dies vom Compiler nicht akzeptiert wird?

+1

Sie haben DateTime zweimal. Der erste Fall und der letzte Nicht-Standardfall sind beide DateTime. Die Nachricht lautet "Die switch-Anweisung enthält mehrere Fälle mit dem Label-Wert '16'". Abstimmung zum Schließen. – john

Antwort

0

Ich habe Nullable.GetUnderlyingType Methode verwendet. Ich habe die Typprüfung auf den Nullable-Typ angewendet, dann den Nullable-Typ identifiziert und schließlich den generischen Typ der Nullable angegeben.

if (Nullable.GetUnderlyingType(propertyType) != null) 
      { 
       // It's nullable 
       Console.WriteLine(propertyType.GetGenericArguments()[0]); 

      } 
2

Ich fand this clever solution using a dictionary instead of a switch. Mit dieser Methode sollte dies für Sie funktionieren:

public class Test { 
    public DateTime A { get; set; } 
    public Int32 B { get; set; } 
    public Int64 C { get; set; } 
    public DateTime? D { get; set; } 
} 

...Main... 
     var @switch = new Dictionary<Type, Action> { 
      { typeof(DateTime),() => Console.WriteLine("DateTime") }, 
      { typeof(Int32),() => Console.WriteLine("Int32") }, 
      { typeof(Int64),() => Console.WriteLine("Int64") }, 
      { typeof(DateTime?),() => Console.WriteLine("DateTime?") }, 
     }; 

     foreach (var prop in typeof(Test).GetProperties()) { 
      @switch[prop.PropertyType](); 
     } 
Verwandte Themen