0

一般的な変換関数を作成しようとしていますが、その方法がわかりません。これは私のスケルトンです:

public static T ConvertByGenerics<T>(string value)
        {
            //what do I write here?
            return default(T);
        }

誰でも私を助けることができますか?文字列を動的に T 型に変換する関数内に何を記述すればよいですか?

4

3 に答える 3

2

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

public T ConvertByGenerics<T>(string value, T defaultValue)
{
   if (!string.IsNullOrEmpty(value))
   {
      return (T)Convert.ChangeType(value, typeof(T));
   }

   return defaultValue;
}
于 2012-05-04T09:30:42.740 に答える
1

他にも試してみることができますが、それらには動的メソッドが含まれます。スニペットには十分な例外処理がなく、確かにある程度最適化できます。

public static T ConvertByGenerics<T>(string input) {

    // be mindful of boxing 
    if (input is T) {
        return (T)(object)input;
    }

    if (input == null) {
        // throw arugment exception 
    }

    // can check for int, long ......
    if (typeof(T).IsEnum) {
        return (T)System.Enum.Parse(typeof(T), input, true);
    }

    if (typeof(T).IsAssignableFrom(typeof(string))) {
        return (T)(object)input;
    }

    try {
        return (T)Convert.ChangeType(input, typeof(T));
    }
    catch { //do nothing
    }

    // might want to cache some converters
    System.ComponentModel.TypeConverter converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
    if (converter.CanConvertFrom(typeof(string))) {
        return (T)converter.ConvertFrom(input);
    }
    else {
        // better though to throw an exception here 
        return default(T);
    }
}
于 2012-05-04T10:40:46.773 に答える
0

あなたが望むことは不可能です。

考えられる型をサポートするには、それが文字列としてどのように表現されるかを知る必要があります。組み込みの値型の中には、Parse文字列の特定の形式を「理解」し、それらを型に解析できるメソッドがありますが、絶対に考えられるすべてのタイプに対して一般的にこれを行う方法はありません。

文字列からすべての型に変換するコードを記述する必要があります。これは、存在するすべての型に対して実行可能ではありません。

于 2012-05-04T09:30:59.260 に答える