2016-06-17 5 views
3

에 문자열을 구문 분석 :나는 다음과 같은 클래스가 일반 대등

public class Filter<T> where T : IComparable<T> { 

    public static Boolean TryParse(String[] values, out List<T> result) {  

    } 

} 

나는 네 다음 "결과"에 변환 된 값을 반환하는 경우 모든 값 T.로 전환이 있는지 확인해야합니다. 그러나 적어도 하나가 컨버터블이 아니면 거짓과 결과를 null로 반환하고 싶습니다.

Int32 구문 분석, 부울 구문 분석을 사용할 것입니다. 그러나이 경우 T 유형이 확실하지 않습니다. 그냥 비교할 수 있다는 것을 알고 있습니다.

어떻게하면됩니까? 사용자 정의 유형의

public class Filter<T> where T : IComparable<T> 
{ 
    public static Boolean TryParse(String[] values, out List<T> result)  
    { 
     result = null; 

     try 
     { 
      TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); 
      result = values.Select(v => converter.ConvertFromInvariantString(v)).ToList(); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
} 

자신을 구현해야합니다 :

+0

당신이'IConvertable '사용할 수 :

문제에 대한 완전한 해결책이 있을까요? –

+1

좋은 질문입니다. 대답은 "지원되는 모든 데이터 유형으로 큰 스위치 블록 사용"일 것이지만 기꺼이 잘못된 것으로 입증 될 것입니다. 물론, 제어 흐름에 대한 예외 사용에 반대하지 않는다면, Convert.ChangeType (value, typeof (T))와 예외 핸들러를 사용하면 효과적입니다. – Heinzi

+0

@ 대니얼 A. 화이트 : T는 Int, Boolean, Datetime 및 Double 만 사용하므로 컨버터블을 사용할 수 있다고 생각합니까? –

답변

4

나는 꽤 잘 대부분의 시간을 작동하는이를 사용합니다.

public static Boolean TryParse(String[] values, out List<T> result) 
{  
    var converter = TypeDescriptor.GetConverter(typeof(T)); // Store these in a concurrent dictionary if you want to be more efficient 
    if (!converter.CanConvertFrom(typeof(T))) 
    { 
     result = null; 
     return false; 
    } 

    result = values.Select(value => (T)converter.ConvertFromInvariantString(value)).ToList(); 
    return true; 
} 
+0

'GetConverter'와'CanConvert' 둘 다'typeof (T)'를 사용합니다. 대신 그들 중 하나가'typeof (String)'이되어서는 안됩니까? – Heinzi

+0

@Rob Lyndon 문자열의 값이 T 유형으로 변환 될 수 있는지를 어디에서 확인하고 있는지 이해할 수 없습니다. –

+0

실례합니다. 변환기를 두 번 만들었습니다. 지금 수정되었습니다. –

3

당신은 (적어도 대부분의 표준 유형의 경우 될 것 같은 자신의 TypeConverter이 그 유형에 대한) TypeConverter 사용할 수 있습니다 TypeConverter s. 이를 수행하는 방법은 this MSDN article을 참조하십시오.

string.IsNullOrEmpty(stringValue) 
    ? default(T) 
    : (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(stringValue); 

유형 설명은 또한 당신의 유형을 전환 여부를 사전에 확인할 수있는 CanConvertFrom 방법을 제공합니다 :

+0

이것으로 Try Catch를 사용하고 싶지 않습니다. –

+0

@MiguelMoura 나는 이해하지만 불행히도이'TypeConverter'에는'TryConvert'가 없으며'string'을 파싱 할 수없는 경우 throw됩니다. 그러나 이것은 호출 당 한 번만 발생하므로 성능에 미치는 영향은 그만큼 커질 수 없습니다. –

+0

[특정 예외 유형없이 catch 사용] (https://msdn.microsoft.com/en-us/library/ms182137.aspx) 및 [제어 흐름에 대한 예외 사용] (http://programmers.stackexchange.com)/questions/189222/are-exceptions-as-control-flow-consider-a-serious-antipattern-if-why)가 베스트 프랙티스리스트에서 높지 않다면 ... –

관련 문제