C#: 제네릭을 사용하여 서명되지 않은 숫자 유형으로 개체를 캐스팅
문제
객체 유형 필드 (데이터 세트에서 온)에서 데이터를 대상 (TYPED) 필드로 변환하기 위해 일부 코드를 작성하려고합니다. 동적 변환을 사용하여 (적어도 시도하고 있습니다)하고 있습니다. 문자열, int, dateTime에서는 잘 작동하는 것 같습니다.
그러나 서명되지 않은 유형 (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());
}
}
해결책
Andrew가 말했듯이, 문제는 상자에서 Unbox를 사용할 수 없다는 것입니다. int
에게 ulong
.
두 가지 옵션 :
1) 박스 a 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));
}
이것은 약간 냄새이지만 예제 코드와 함께 작동합니다. 실제 코드에서 첫 번째 방법을 사용할 수 있다면 더 나을 것입니다.
다른 팁
UL_O 객체는 서명되지 않은 숫자가 아닌 int이기 때문입니다. 캐스팅 기능에있을 때는 대상 데이터를 사용하면서 캐스팅하고 있습니다. object
. 명시 적/암시 적 캐스트 연산자 (사용해야 할 것)는이를 구현하는 유형의 컨텍스트에 객체가있을 때만 작동합니다 (연산자는 런타임에 동적으로보다 컴파일 시간에 정적으로 연결되어 있기 때문에).
이것이 실제로 당신이하고 싶은 일이라면, 단지 똑바로 캐스트 대신 이것을 사용하십시오.
target = (T)Convert.ChangeType(value, typeof(T));
CLR은 상자 값 유형이 실제로 int입니다.
object ul_o = (object)2;
당신이 a에 캐스팅하려고 할 때 ulong
Unbox an을 할 수 없기 때문에 할 수 없습니다 int
직접 a ulong
.
나는 당신이 원하는 것이 더 비슷하다고 생각합니다 (테스트되지 않았지만 방향 적으로 맞습니다) ...
public static void CastIt<T>( object value ) where T : IConvertable
{
return ( T )Convert.ChangeType( value , typeof( T ) );
}
편집 : Skeet에 의해 퍼져! :)
이것은 실제로 당신의 질문에 대한 답이 아닙니다. .NET 3.5를 사용하는 경우 LINQ에서 데이터 세트 코드에는 구현하는 것과 같은 기능이 포함됩니다. 특정 확장 방법은 필드입니다u003CT> () Datarow 클래스에서.