在我的一个项目中,我使用了以下两种方法。1. GetDoubleValue和2. GetIntValue。GetDoubleValue使用double.TryParse来参数字符串,如果失败则返回0,而GetIntValue尝试使用int.TryParse来参数字符串,如果失败则返回0。我想要的是将这两个方法组合成一个泛型方法,该方法与string str一起接收参数T,这样如果我想使用GetDoubleValue方法,我可以使用double作为参数T,如果我想使用GetIntValue方法,我可以使用Int作为参数T
public double GetDoubleValue(string str)
{
double d;
double.TryParse(str, out d);
return d;
}
public int GetIntValue(string str)
{
int i;
int.TryParse(str, out i);
return i;
}
注意:我已经尝试过类似这样的东西;
private T GetDoubleOrIntValue<T>(string str) where T : struct
{
T t;
t.TryParse(str, out t);
return t;
}
编辑
在我的数据库中,我的不同表中有超过30列的数字数据类型。如果用户没有在文本框中键入任何内容,即他将所有或部分文本框留空,我想在每一列中插入0。如果我不使用GetIntValue方法,我将不得不使用方法体超过30次。这就是为什么我要通过方法方法来做这件事。例如,我正在写30多个例子中的3个
cmd.Parameters.Add("@AddmissionFee", SqlDbType.Decimal).Value = GetIntValue(tbadmissionfee.Text);
cmd.Parameters.Add("@ComputerFee", SqlDbType.Decimal).Value = GetIntValue(tbcomputerfee.Text);
cmd.Parameters.Add("@NotesCharges", SqlDbType.Decimal).Value = GetDoubleValue(tbnotescharges.Text);
我想结合上述两个方法,因为今天我有两个这样的方法,如果结合起来,不会给编程带来任何更好的改进,但明天我可能会有几十个这样的方法,最好合并成一个泛型方法。例如,我可能有GetInt32Value,GetShortValue等希望现在清楚了为什么我想要这个?
发布于 2012-05-14 04:34:55
你可以这样做:
public static T GetDoubleOrIntValue<T>(this string str) where T : IConvertible
{
var thisType = default(T);
var typeCode = thisType.GetTypeCode();
if (typeCode == TypeCode.Double)
{
double d;
double.TryParse(str, out d);
return (T)Convert.ChangeType(d,typeCode) ;
}
else if (typeCode == TypeCode.Int32)
{
int i;
int.TryParse(str, out i);
return (T)Convert.ChangeType(i, typeCode);
}
return thisType;
}
然后当你调用它的时候:
string d = "1.1";
string i = "3";
double doubleValue = d.GetDoubleOrIntValue<double>();
int intValue = i.GetDoubleOrIntValue<int>();
但整件事对我来说似乎有点傻。
编辑:看到其他人使用Convert.ChangeType...which提供了一个泛型返回类型。
发布于 2012-05-14 03:41:38
我会考虑写一个扩展或静态方法:
delegate bool TryParse<T>(string str, out T value);
public static T GetValue<T>(this string str, TryParse<T> parseFunc)
{
T val;
parseFunc(str, out val);
return val;
}
然后,您必须提供要使用的TryParse
实现:
int i = "1234".GetValue<int>(int.TryParse);
注意,如果解析失败,此函数将以静默方式返回默认值。如果TryParse
委托返回false,则可能需要返回default(T)
。
发布于 2012-05-14 03:40:57
我同意马克·拜尔斯的观点。尝试使此方法泛型可能不是一个好主意。少量的代码重复并不会有什么坏处(只要它真的只有一点点)。事实上,你可以在你的通用版本中使用任何struct
,这对我来说也不是一个好主意。
如果你真的想这样做,你可以尝试使用反射(就像Minustar建议的那样),但那样做既丑陋又慢。
相反,您可以使用Convert.ChangeType()
private T GetValue<T>(string str) where T : struct
{
return (T)Convert.ChangeType(str, typeof(T));
}
https://stackoverflow.com/questions/10574504
复制相似问题