2014-10-16 3 views
1

다음 예제에서는 ConvertNumericStringObj를 두 번 호출하여 Type int 개체를 두 번 보냅니다.숫자 문자열 개체를 nullable 숫자로 변환하는 방법

string strValue = "123"; 
object obj = ConvertNumericStringObj(typeof(int), strValue); 
object obj = ConvertNumericStringObj(typeof(int?), strValue); 

public static object ConvertNumericStringObj(Type conversion, object value) 
{ 
    var t = conversion; 
    if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
    { 
     if (value == null) 
     { 
      return null; 
     } 
     t = Nullable.GetUnderlyingType(t); 
    } 
    return Convert.ChangeType(value, t); 
} 

내 질문은 : 그것은 int? 개체를 반환하므로이를 문자열 및 int? 유형에 전달하고 변환 어떻게든지이 있습니까?

+0

: Int.TryParse는() – bit

+4

당신은' 박스형'Null 허용을 가질 수 없습니다. 런타임에는 nullable에 대한 특별한 boxing 동작이 있습니다. 객체 참조가 박스형'T' 인 경우에는 항상 'T?'로 변환 될 수 있습니다. –

+2

mike z의 의견보기. 즉, 메서드를 변경할 수 있으면 일반화하고 객체 대신 T를 반환하도록 할 수 있습니다. 그건 Nullable 권투 제한 주위에 얻을 것이다. 그런 다음 Nullable 코드가 이미 존재합니다 (Convert.ChangeType이 Nullable 으로 변환되지 않기 때문에 거기에 있음). 기본 형식으로 변환하여 Nullable 에 다시 바인딩하여 반환하십시오. 그것. 가는 데는 많은 어려움이 있습니다. 그러나 이런 식으로해야한다면, 할 수 있습니다. –

답변

1

유형을 int 또는 int? 중 하나가 될 수 있도록하려는 경우 "제네릭"을 찾고 있습니다. 이렇게하면 원하는 것을 얻을 수 있습니다.

public static T ConvertNumericStringObj<T>(string value) 
{ 
    var t = typeof (T); 
    if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) 
    { 
     if (string.isNullOrEmpty(value)) 
      return default(T); 

     t = Nullable.GetUnderlyingType(t); 
    } 
    return (T)Convert.ChangeType(value, t); 
} 

그러나, 난 그냥 대신 int.TryParse()으로 인한 null 허용 정수를 반환하지 왜 궁금 하군요. 변환 사용을 int로 문자열을

public static int? ConvertNumericStringObj(string value) 
{ 
    int? x; 

    if (int.TryParse(value , out x) 
     return x; 

    return null; 
} 
+0

제네릭에 유창하지는 않지만이 작업을 확실히 할 수는 없지만이 호출은 'T'Type을 명시 적으로 설정해야합니다. 그렇지 않니? 불행히도 내가 겪은 것이 아닙니다. – Hank

+0

이 방법으로 수행하려는 작업을 다시 생각해 볼 수 있습니다. 기본 유형을 예상 할 수 없다면 반환 값을 어떻게 소비합니까? ** 항상 ** 네이티브 메소드를 호출 할 때 nullable 유형을 반환해야합니다 (위의 일반 메소드로 'int'를 전달)하거나 특정 유형 (예 : 'int' 또는'int? ')을 항상 알고 있어야합니다. – dexterlo

0

가능합니다. 시도하십시오 Int32.TryParse.

public static int? ConvertNumericStringObj(string strValue) 
{ 
    int x; 
    if (Int32.TryParse(strValue , out x) 
     return x; 
    return null; 
} 

그러나 반드시 int?을 전달해야하는지 궁금합니다.

편집 : OP 조금 일반 수를 요청로,

public static T? ConvertNumericStringObj<T>(string strValue) 
{ 
    if (string.IsNullOrEmpty(strValue)) 
     return null; 
    return (T) Convert.ChangeType(strValue, typeof(T)); 
} 

이 방법을 확장 메서드를 (거의) 같은하려고하면 다음과 같은 사용할 수 있습니다

INT를? x = strX.ConvertNumericStringObj();

+1

입력 매개 변수를 제거하면됩니다. 이제는 다른 유형을 처리 할 수 ​​없습니다. –

+0

@BenVoigt, 나는 생각하지 않는다, OP는 다른 유형을 돌 보았다. 그가 말하기를,'제 질문은 : 문자열과 int를 전달할 수있는 방법이 있습니까? .. ' – Zeeshan

+0

제목에 대한 나의 실수, 그것에 대한 사과, 나는 그것이 일반적이라는 것을 의미했다. – Hank

관련 문제