2015-01-22 2 views
1

TypeDescriptor 클래스에 ussue가 있습니다.TypeDescriptor가 날짜를 인식하지 않습니다.

날짜가 포함 된 쿠키가 있습니다. 날짜가 문자열로 변환 된 다음 다시 도우미 메서드를 사용하여 다시 변환됩니다.

내 스테이플 확장 메서드 중 하나가 변환을 수행하는 데 사용되지만 날짜가 문자열에서 다시 변환 할 수 없기 때문에 강제 오류가 발생합니다.

여기에 메시지 I 출력입니다 :

22/01/2015 14시 29분 15초이 나에게 날짜 시간처럼 보이는 날짜 시간

로 변환 할 수 없습니다!

Convert.ToDateTime()을 사용하면 문제를 극복 할 수 있으므로 일반적으로 코드는 괜찮습니다. 나는 날짜까지 아무 문제없이 elwhere 날짜에도 사용합니다.

  Set = new SortedSet<TrackedItem>(set 
       .Split(';') 
       .Select(s => 
       { 
        var parts = s.Split(','); 
        return new TrackedItem(
          parts[0].ConvertTo<int>(), 
          Convert.ToDateTime(parts[1])); 
       })); 

어떤 아이디어 :

유일한 차이점

내가이 같은 LINQ 문의 중간에 변환있어 것입니다?

public static T ConvertTo<T>(this object obj, bool throwInvalid = false) 
     where T : IConvertible 
    { 
     // Object does not require converting. 
     if (obj is T) return (T)obj; 

     // Determine if object can be converted. 
     var type = typeof(T); 
     var converter = TypeDescriptor.GetConverter(type); 

     var isConvertible = converter != null && converter.IsValid(obj); 

     var error = string.Format("'{0}' could not be converted to type {1}", obj, type.Name); 

     // If no conversion is available, and defaults not allowed throw an error. 
     (!isConvertible && throwInvalid).ThrowTrue(error); 

     // If the object is convertible, convert it, else return the default(T). 
     return isConvertible ? (T)converter.ConvertFrom(obj) : default(T); 
    } 

답변

2

너는 en-GB 문화권에서 실행중인 날짜 예를 추측하고 있습니다. 불행하게도 this related q/a에서 자유롭게 그려 내기 위해 IsValid은 항상 답변을 결정하기 위해 CultureInfo.InvariantCulture (미국 날짜 형식)을 사용합니다. 따라서 예제와 같이 날짜가 en-GB 인 경우 IsValidfalse을 반환합니다. 그러나 기본적으로 현재 스레드 문화권을 사용하는 ConvertFrom은 성공합니다!

흥미롭게 the latest docs for IsValid는 용적이 실제로 버그인지의 문제를 회피 :

IsValid있어서 값이 주어진 전환 될 수 있는지를 결정하기보다는 유형 내의 값을 확인하는 데 사용된다

유형. 예를 들어 IsValid은 주어진 값이 열거 형에 대해 인 지 확인하는 데 사용할 수 있습니다.

당신은 ConvertTo를 포장하여 자신의 WillConvertSucceed 방법을 쓸 수 있습니다 : -

그래서 정말 당신이 모든 여기 IsValid를 사용하지 않아야 동일한 문서는 제안에 가서 일을해야한다 예외 블록에있는 ConvertFrom 메쏘드.

그런 방법으로 실제로 걱정할 CultureInfo을 사용할 수 있습니다.

+0

Aakash의 스팟 - 제거가 유효하지 않으며 모든 것이 작동합니다. 매우 유익한 답변을 주셔서 감사합니다. 매우 감사드립니다. – dotnetnoob