2009-04-21 4 views
2

데이터 형식의 개체 유형 필드 (데이터 집합에서 가져온 데이터)를 대상 (입력 된) 필드로 변환하는 코드를 작성하려고합니다. 나는 (최소한 노력) 동적 변환을 사용하고있다. 그것은 문자열, 정수, DateTime 잘 작동하는 것으로 보인다.C# : Generic을 사용하여 부호없는 숫자 형식으로 개체 전송

그러나 부호없는 유형 (ulong, uint)에서는 작동하지 않습니다. 아래에는 내가하고 싶은 것을 보여주는 간단한 코드가 있습니다. ul var 유형을 ulong에서 int로 변경하면 올바르게 작동합니다.

아무도 단서가 있습니까?

public class console 
{ 

    public static void CastIt<T>(object value, out T target) 
    { 
     target = (T) value; 
    } 

    public static void Main() 
    { 
     ulong ul; 
     string str; 
     int i; 
     DateTime dt; 

     object ul_o = (object) 2; 
     object str_o = (object) "This is a string"; 
     object i_o = (object)1; 
     object dt_o = (object) DateTime.Now; 

     Console.WriteLine("Cast"); 

     CastIt(ul_o, out ul); 
     CastIt(str_o, out str); 
     CastIt(i_o, out i); 
     CastIt(dt_o, out dt); 

     Console.WriteLine(ul); 
     Console.WriteLine(str); 
     Console.WriteLine(i); 
     Console.WriteLine(dt.ToString()); 
    } 

} 

답변

12

앤드류가 말했듯이, 문제는 당신 할 수있는 박스형 intulong에에서 언 박스하지 .

두 가지 옵션 :

1) 박스 ulong 대신 :

object ul_o = (object) 2UL; 

또는

ulong tmp = 2; 
object ul_o = tmp; 

2) 확인 CastIt<T> 사용 Convert.ChangeType :

public static void CastIt<T>(object value, out T target) 
{ 
    target = (T) Convert.ChangeType(value, typeof(T)); 
} 

이것은 약간 냄새가 있지만 예제 코드와 함께 작동합니다. 실제 코드에서 첫 번째 방법을 사용할 수 있다면 더 좋을 것입니다.

+0

Convert.ChangeType +1 - 어떻게 든 그 중 하나를 발견하지 못했습니다 – galaktor

0

CLR은 박스형 값 유형이 int로 사실이기 때문에이 방법으로 캐스팅 할 수 없습니다 :

object ul_o = (object)2; 

당신이 ulong 캐스팅하려는 당신이 할 수 없기 때문에 당신은 할 수 없습니다 언 박스 intulong에 직접 입력하십시오.

+0

나는 알고 있습니다. 그런데 내가 왜 그것을 변환 할 수없는 이유는 무엇입니까? 당신은 그 'ass'의 끝 부분에 'u'를 써야한다고 생각하니?like : object o = 10u; Jon이 제안한대로 ? 건배 – Andres

+1

이렇게하면 컴파일러가 int가 아닌 ulong을 추론 할 수 있다는 힌트를 얻을 수 있습니다. –

3

ul_o 객체가 부호없는 수가 아닌 int이기 때문입니다. 전송 기능을 사용할 때 object의 컨텍스트에서 대상 데이터를 가지고있는 동안 전송 중입니다. 명시 적/암시 적 캐스트 연산자 (사용자가 사용해야하는 것)는 객체를 구현하는 유형의 컨텍스트에있는 경우에만 작동합니다 (런타임에 동적으로 컴파일되는 것이 아니라 컴파일 타임에 정적으로 링크되기 때문에). 이 대신 직선 캐스트, 당신이 원하는 무엇을 정말 경우

, 이것을 사용 :

target = (T)Convert.ChangeType(value, typeof(T)); 
0

나는 ... 당신이 원하는 것은 같은 더 생각 (테스트되지 않은,하지만 방향성 수정)

public static void CastIt<T>(object value) where T : IConvertable 
{ 
    return (T)Convert.ChangeType(value , typeof(T)); 
} 

편집 : 스키트에 의해 특종! :)

0

이것은 실제로 질문에 대한 답변이 아닙니다. .Net 3.5를 사용하는 경우 Linq to DataSets 코드에는 구현중인 것과 같은 기능이 포함되어 있습니다. 특정 확장 메서드는 DataRow 클래스에서 < T>() 필드가됩니다.