2009-05-21 5 views
0

형식을 데이터베이스 (long, DBNull, bool, string 등 ...)가 호환으로 반환 한 형식을 변환 할 수 있어야하는 사내 라이브러리에 사용할 형식 변환기를 만듭니다. 유형.문자열을 알 수없는 숫자 유형으로 변환하는 올바른 방법은 무엇입니까?

이 모든 중 하나를 주조 할 수있는 항목에 대한 핀과 멋쟁이 작동 : 구문 분석 할 수

try { return (T)value } catch(InvalidCaseException) { } 

을 또는 :

내가 벽돌 벽 때 치는거야, 그러나 Convert to a Nullable<T> from a string using Reflection

참조 이 원하는 동작을 원합니다 :

Assert.That(
    2, 
Is.EqualTo(
    Converter<long>.Convert("2.1") 
)); 

문제점은 e Pasre 및 TryParse 함수는 실제 원하는 결과가 소수를 자르는 것이므로 잘못된 형식으로 다시 되돌립니다. 당신이 반사를 사용하여 알 수없는 값 유형에 "2.1"와 같은 문자열을 구문 분석하는 가장 좋은 방법이 될 것 어떻게 생각하십니까

?

편집 : 현재 내가 사용하고 있습니다 :

if (Nullable.GetUnderlyingType(t) != null) 
{ 
    t = Nullable.GetUnderlyingType(t); 
} 

MethodInfo parse = t.GetMethod("Parse", new Type[] { typeof(string) }); 

if (parse != null) 
{ 
    object parsed = parse.Invoke(null, new object[] { value.ToString() }); 
    return (T)parsed; 
} 
else 
{ 
    throw new InvalidOperationException("The value you specified is not a valid " + typeof(T).ToString()); 
} 

답변

4

.NET 버전은 무엇과 값의 어떤 범위? 하나 개의 옵션, 예를 들어,

T val = Convert.ChangeType(decimal.Parse("2.1"), typeof(T)) 

(위의 단지 중앙 변환을 보여줍니다 ... 진수로 구문 분석하고 거기에서 변환하는 것 - 그것은 기존의 코드에 맞게 시도하지 않습니다)

거대한/아주 작은 값에는 작동하지 않지만 double과 같은 반올림 문제는 발생하지 않을 것입니다.

+0

나는 그것이 나를 위해 일할 것이라고 생각한다. 기본적으로, 만약 내가 double을 원한다면, "Parse"가 그것을 집어 올릴 것입니다. 그러나 "1000000000000.1"과 같은 번호가 있으면 오랫동안 사용할 수있게됩니다. 나는 10 진수가 128 비트임을 알지만, 긴 것보다 훨씬 더 정밀도가 높은 범위를 가지고 있는가? –

+0

주 값의 관점에서, 그것은 단지 96 비트입니다 - 그렇습니다, long보다 길다 (64 비트); 결과적으로 CPU 사용량은 더 낮습니다. –

관련 문제