2

サード パーティのアプリケーションからのオブジェクト値は、正しいが正しく入力されていない値を提供します。このオブジェクトの値を、選択した型に作成しているジェネリック メソッドに入力しようとしています。問題を示すために例をモックアップしました。

static void Main(string[] args)
{
    decimal d = 1; // this can't be changed
    var v = Method<int>(d); // what I'm trying to do
}

//the code in this method can be changed
static T Method<T>(object input)
{
    T output = default(T);

    //causes InvalidCastException
    output = (T)input;

    return output;
}

ご覧のとおり、値 '1' は有効な整数ですが、サード パーティのアプリケーションはそれを 10 進数として入力するため、整数に変換しようとすると失敗します。このシナリオで失敗しないように、ジェネリック メソッドをどのように変更できますか?

4

3 に答える 3

2

次のように置き換えますoutput = (T)input;

output = (T)Convert.ChangeType(input, typeof(T));
于 2013-02-01T17:18:19.863 に答える
1

次のようなことを試してください:

static T Method<T>(object input)
{
    T output = default(T);

    var t = input.GetType();
    TypeConverter tc = TypeDescriptor.GetConverter(t);
    output = (T)tc.ConvertTo(input, typeof(T));

    return output;
}

型に互換性があることを確認するために、エラー チェックを追加する必要があることは明らかです。TypeConverter のメソッドを参照してください。

追加する必要がありますusing System.ComponentModel;

于 2013-02-01T17:18:23.150 に答える
1

「キャスティング」と「変換」は、2 つの非常に異なるものです。残念ながら、場合によっては C# の構文が同じであるため、トピックが混乱する可能性があります。

inputそれが実際のものであるため、 にのみキャストできますdecimaladecimalを anintに変換できますが、変換できずobject、たまたま adecimalから anが含まれていintます。

したがって、次のようにします。

static int ToInt(object input)
{
    return (int)(decimal)input;
}

それはうまくいくでしょう。

to からの変換演算子がある一般的なケースを処理したい場合は、inputほとんどT運がありません。これらの変換は、実行時のメカニズムではなく、コンパイル時のメカニズムです。

于 2013-02-01T17:19:18.753 に答える