2009-04-21 8 views
2

オブジェクト型フィールド(DataSetから取得)のデータを宛先(型付き)フィールドに変換するコードを記述しようとしています。私は(少なくとも試して) 動的変換​​を使用しています。それは、文字列、int、DateTimeで正常に動作するようです。C#:ジェネリックスを使用してオブジェクトを符号なし数値型にキャスト

しかし、符号なしの型(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へのVHS版ではありません。

つのオプション:

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

+1のConvert.ChangeType - 何とか私はそれに気付かなかった – galaktor

0

CLRは、あなたのボックス化値型がint、実際にあるので、あなたがこの方法をキャストすることはできません:

object ul_o = (object)2; 

あなたはulongにキャストしようとしているあなたがすることができないのであなたがすることはできませんVHS版intを直接ulongに挿入します。

+0

わかりました。しかし、それはなぜそれが変換されていないのですか?あなたは、義務の終わりに「u」を置くために必要だと思いますか?like: オブジェクト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>()になります。

関連する問題