C番号:ジェネリックを使用して符号なし数値型にオブジェクトをキャスト
質問
私はそれの宛先(入力された)フィールドに(データセットから来る)オブジェクト型のフィールドからデータを変換するためにいくつかのコードを記述しようとしています。私はそれを使用して(少なくともしようとして)やっています ダイナミック変換。文字列、int型、DateTimeのために正常に動作するようです。
しかし、それは符号なしのタイプ(ULONG、UINT)には使用できません。以下は、私が何をしたいのかを示し、単純なコードがあります。あなたはintにULONGからのUL VARの種類を変更した場合、それが正常に動作します。
誰もが手掛かりを持っていますか?
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());
}
}
解決
、問題はあなたがint
する箱入りulong
から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));
}
これは少し臭いですが、あなたの例のコードで動作します。あなたの実際のコードに最初の方法を使用することができれば、それがより良いでしょう。
他のヒント
です。あなたはキャスト関数にいるときobject
のコンテキストで対象データを持ちながら、あなたはキャストしています。明示的/暗黙のキャスト演算子(ご使用される必要があるだろう何である)(これらの演算子は静的ではなく動的に実行時に比べて、コンパイル時にリンクされているので)あなたがそれらを実装する型のコンテキスト内のオブジェクトを持っている場合にのみ動作します。
、これを使用します:
target = (T)Convert.ChangeType(value, typeof(T));
CLRは、あなたのボックス化値型は、実際にはint型であるため、この方法をキャストすることはできません。
object ul_o = (object)2;
するとき、あなたはulong
に直接int
をUnboxのことができないので、あなたがすることはできませんulong
にキャストしようとしています。
私は何をしたいことより(未テストが、方向的に正しい)に似ていると思います...
public static void CastIt<T>( object value ) where T : IConvertable
{
return ( T )Convert.ChangeType( value , typeof( T ) );
}
編集:スキートによってすくわ! :)
これは本当にあなたの質問への答えではありません。ちょうど言及したかったことは、.NET 3.5を使用している場合は、<のhref = "http://blogs.msdn.com/adonet/archive/2007/01/26/querying-datasets-introduction-to-linq-to -dataset.aspx」のrel = 『nofollowをnoreferrer』> LINQのコードは、あなたが実装しているかのような機能が含まれてのデータセットへ。具体的な拡張方法はのDataRowクラスにフィールド