C番号:ジェネリックを使用して符号なし数値型にオブジェクトをキャスト

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

  •  13-09-2019
  •  | 
  •  

質問

私はそれの宛先(入力された)フィールドに(データセットから来る)オブジェクト型のフィールドからデータを変換するためにいくつかのコードを記述しようとしています。私はそれを使用して(少なくともしようとして)やっています ダイナミック変換。文字列、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));
}

これは少し臭いですが、あなたの例のコードで動作します。あなたの実際のコードに最初の方法を使用することができれば、それがより良いでしょう。

他のヒント

あなたのul_oオブジェクトはint型ではなく、符号なしの数であるため、

です。あなたはキャスト関数にいるとき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クラスにフィールド()になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top