我正在尝试编写一个通用的转换函数,但我不知道该怎么做。这是我的骨架:
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
“理解”某些字符串格式并可以将它们解析为类型的方法,但绝对有没有办法对每一种可能的类型都这样做。
您需要编写代码以将字符串转换为每种类型 - 这对于现有的每种类型都是不可行的。