3

オブジェクトタイプフィールド(DataSetから取得)からのデータを宛先(型付き)フィールドに変換するコードを記述しようとしています。私は動的変換を使用して(少なくとも試して)それを行っています。文字列、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());
    }

}
4

5 に答える 5

12

アンドリューが言うように、問題はあなたが箱入りからに箱を開けることができないということintですulong

2つのオプション:

ulong1)代わりにボックスa :

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));
}

これは少し臭いですが、サンプルコードで機能します。実際のコードで最初の方法を使用できるのであれば、それはより良いでしょう。

于 2009-04-21T18:42:23.303 に答える
3

これは、ul_oオブジェクトがintであり、符号なしの数値ではないためです。キャスト関数を使用している場合は、のコンテキストでターゲットデータを使用しながらキャストしますobject。明示的/暗黙的なキャスト演算子(使用する必要があるもの)は、それらを実装する型のコンテキストにオブジェクトがある場合にのみ機能します(これらの演算子は、実行時に動的にリンクされるのではなく、コンパイル時に静的にリンクされるため)。

これが本当にやりたいことである場合は、ストレートキャストではなく、次を使用します。

target = (T)Convert.ChangeType(value, typeof(T));
于 2009-04-21T18:39:28.707 に答える
0

ボックス化された値型は実際にはintであるため、CLRではこの方法でキャストすることはできません。

object ul_o = (object)2;

にキャストしようとしているときは、に直接ulongボックスを解除できないため、できません。intulong

于 2009-04-21T18:39:20.237 に答える
0

私はあなたが望むものはもっと似ていると思います(テストされていませんが、方向的に正しい)...

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

編集:スキート射撃!:)

于 2009-04-21T18:44:35.730 に答える
0

これは実際にはあなたの質問に対する答えではありません。.Net 3.5を使用している場合、LinqtoDataSetsコードには実装しているものと同様の機能が含まれていることをお伝えしたいと思います。特定の拡張メソッドは、DataRowクラスのField <T>()になります。

于 2009-04-21T18:46:10.470 に答える