2017-11-29 17 views
1

Type 검사를 사용하여 switch 문을 작업하고 있습니다. 다음 코드는 모든 유형에서 완벽하게 작동하지만 Nullable 유형을 사용하는 것이 문제입니다.DateTime의 GetType이 상수 값이 아닌 이유

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

나는 그 GetType로 변경하고 DateTime.Today.GetType().ToString() 문자열로 우리에게 System.DateTime을 줄 것입니다 노력했다. 그러나 컴파일러를 사용할 때 유효하지 않은 오류가 발생합니다 (Constant string). 주어진 시간 인스턴스에서 DateTime.Today.GetType()은 언제나 우리에게 System.DateTime을주었습니다. 왜 이것이 컴파일러에서 받아 들여지지 않습니까?

+1

DateTime이 두 번 있습니다. 첫 번째 경우와 마지막 기본값이 아닌 경우는 둘 다 DateTime입니다. 메시지는 "switch 문에 레이블 값 '16'이있는 여러 사례가 있습니다. 투표를 종료합니다. – john

답변

0

나는 Nullable.GetUnderlyingType 방법을 사용했습니다. nullable 유형에 대해 유형 검사를 적용한 다음 nullable 유형을 식별 한 다음 Nullable의 제네릭 유형을 최종적으로 지정했습니다.

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

      } 
2

나는 this clever solution using a dictionary instead of a switch을 발견했다. 이 방법을 사용하면 다음 작업을 수행 할 수 있습니다.

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