C#: 제네릭을 사용하여 서명되지 않은 숫자 유형으로 개체를 캐스팅

StackOverflow https://stackoverflow.com/questions/773971

  •  13-09-2019
  •  | 
  •  

문제

객체 유형 필드 (데이터 세트에서 온)에서 데이터를 대상 (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 클래스에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top