一般的な変換関数を作成しようとしていますが、その方法がわかりません。これは私のスケルトンです:
public static T ConvertByGenerics<T>(string value)
{
//what do I write here?
return default(T);
}
誰でも私を助けることができますか?文字列を動的に T 型に変換する関数内に何を記述すればよいですか?
次のようなものを試してください:
public T ConvertByGenerics<T>(string value, T defaultValue)
{
if (!string.IsNullOrEmpty(value))
{
return (T)Convert.ChangeType(value, typeof(T));
}
return defaultValue;
}
他にも試してみることができますが、それらには動的メソッドが含まれます。スニペットには十分な例外処理がなく、確かにある程度最適化できます。
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);
}
}
あなたが望むことは不可能です。
考えられる型をサポートするには、それが文字列としてどのように表現されるかを知る必要があります。組み込みの値型の中には、Parse
文字列の特定の形式を「理解」し、それらを型に解析できるメソッドがありますが、絶対に考えられるすべてのタイプに対して一般的にこれを行う方法はありません。
文字列からすべての型に変換するコードを記述する必要があります。これは、存在するすべての型に対して実行可能ではありません。