7

型パラメーターがたまたま文字列の場合は ToString() を使用し、それ以外の場合はキャストしますが、キャストが機能しない場合は null を返します。基本的にv、例外をスローすることなく、可能な限り多くの情報を取得します。

Tキャストを試みる前に、それが実際に aであることを確認しますstringが、コンパイラはまだファンではありません。

Cannot convert type 'string' to 'T'

そして、ここに私の方法があります:

public T? Convert<T>(object v)
{
    if (typeof(T) == typeof(string)) {
    return (T)v.ToString(); // Cannot convert type 'string' to 'T'  
    } else try {
      return (T)v;
    } catch (InvalidCastException) {
    return null;
    }
}

また、これがある種の許されない罪であるかどうかも教えてください。型が混在する可能性のあるデータ構造を処理するために使用しています。

4

4 に答える 4

28

objectジェネリック型にキャストするときは、基本的に経由する必要があります。

return (T)(object) v.ToString()

return (T)(object) v;

isただし、キャッチするのではなく使用しInvalidCastExceptionます。

これが必要な理由の詳細については、Eric Lippert の最近のブログ投稿を参照してください

特に:

コンパイラは、この変換が成功する可能性がある唯一の方法Uはブール値の場合であるが、何でもかまいUません! Uコンパイラは、ほとんどの場合 が で構築されないことを想定しているboolため、このコードはほぼ間違いなくエラーであり、コンパイラはその事実をユーザーに通知しています。

( ~Tの代用)Ustringbool

于 2012-08-08T14:07:22.217 に答える
3

object戻り値の型がジェネリックであるため、文字列をキャストする必要があります。

return (T)(object)v.ToString();
于 2012-08-08T14:07:13.907 に答える
0
using System.ComponentModel;

...

public T Convert<T>(object v) {
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v);
}

警告、T と v に含まれるオブジェクトの間に変換が存在しない場合、これは例外をスローします。

于 2012-08-08T17:23:54.953 に答える
0

objectに変換する前に に変換してみてくださいT

return (T)(object)v; 
于 2012-08-08T14:08:45.593 に答える