public static T GetKeyValue<T>(string settingType, string settingKey, T defaultValue)
{
object keyValue = null;
keyValue = fun(); //这个fun()返回的是string类型 if (keyValue == null || string.IsNullOrEmpty(keyValue.ToString()))
return defaultValue; try
{
return (T)keyValue; //这儿出错
}
catch
{
return defaultValue;
}
}
在调用时,如果转为int型,则上面的return (T)keyValue; 出错,若为字符型,则正常:
GetKeyValue<int>("ftp", "port", 20); //(T)keyValue 无法将“keyValue”作为“T”取消装箱 int
GetKeyValue<string>("ftp", "password", "1111"); //这是正常的
已经是object了,进行强制转换,为什么非string型都不可以呢????
后来用Convert.ChangeType转换解决问题了,但不明白上面的强制转换不行.
如
string s= "123";
object o = i;
string j = (string)o;则可以
fun函数应该是private T fun<T>()
{}
这样声明,既然用了泛型,就贯彻到底,否则不如还是强转。
我那个fun是从数据库中读出来的配置值,数据库中存的是nvarchar型,里面的值可以是数字"20",也可以是字符"username",还可能是其他类型。
所以fun返回是string型。
函数既是判断fun返回值是否为空,为空时返回默认值;否则返回fun的值。
有关类型转换,如青龙白虎说的:
强制类型转换是拆箱的过程,并不是你想象的转换数据类型,只不过是一个被装过箱为基类的对象强制转换为子类对象,也就是必须保证拆箱后的对象必须是装箱前的对象,否则转换必然报错。
------------
我以为(T)keyValue可以转换。后来我这样处理了:
public static T GetKeyValue<T>(string settingType, string settingKey, T defaultValue)
{
string keyValue = fun(); if (keyValue == null || string.IsNullOrEmpty(keyValue.ToString()))
return defaultValue; try
{
object ConvertTemp = Convert.ChangeType(keyValue, typeof(T));
return (T)ConvertTemp;
}
catch
{
return defaultValue;
}
}
如果你用反射测试下下面给你的代码,应该就会很容易理解的了。object keyValue = null;
keyValue = fun();
if(keyValue.GetType() == typeof(string))//这里成立
MessageBox.Show("keyValue是string类型");
if(keyValue.GetType() == typeof(object))//这里不成立
MessageBox.Show("keyValue是object类型");