首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当T为双精度或整型时,如何在泛型方法中使用<T>.TryParse

当T为双精度或整型时,如何在泛型方法中使用<T>.TryParse
EN

Stack Overflow用户
提问于 2012-05-14 03:19:31
回答 8查看 20.8K关注 0票数 24

在我的一个项目中,我使用了以下两种方法。1. GetDoubleValue和2. GetIntValue。GetDoubleValue使用double.TryParse来参数字符串,如果失败则返回0,而GetIntValue尝试使用int.TryParse来参数字符串,如果失败则返回0。我想要的是将这两个方法组合成一个泛型方法,该方法与string str一起接收参数T,这样如果我想使用GetDoubleValue方法,我可以使用double作为参数T,如果我想使用GetIntValue方法,我可以使用Int作为参数T

代码语言:javascript
复制
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;
}

注意:我已经尝试过类似这样的东西;

代码语言:javascript
复制
private T GetDoubleOrIntValue<T>(string str) where T : struct 
{
    T t;
    t.TryParse(str, out t);
    return t;
}

编辑

在我的数据库中,我的不同表中有超过30列的数字数据类型。如果用户没有在文本框中键入任何内容,即他将所有或部分文本框留空,我想在每一列中插入0。如果我不使用GetIntValue方法,我将不得不使用方法体超过30次。这就是为什么我要通过方法方法来做这件事。例如,我正在写30多个例子中的3个

代码语言:javascript
复制
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等希望现在清楚了为什么我想要这个?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-05-14 04:34:55

你可以这样做:

代码语言:javascript
复制
   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;
}

然后当你调用它的时候:

代码语言:javascript
复制
string d = "1.1";
string i = "3";

double doubleValue = d.GetDoubleOrIntValue<double>();
int intValue = i.GetDoubleOrIntValue<int>();

但整件事对我来说似乎有点傻。

编辑:看到其他人使用Convert.ChangeType...which提供了一个泛型返回类型。

票数 8
EN

Stack Overflow用户

发布于 2012-05-14 03:41:38

我会考虑写一个扩展或静态方法:

代码语言:javascript
复制
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实现:

代码语言:javascript
复制
int i = "1234".GetValue<int>(int.TryParse);

注意,如果解析失败,此函数将以静默方式返回默认值。如果TryParse委托返回false,则可能需要返回default(T)

票数 11
EN

Stack Overflow用户

发布于 2012-05-14 03:40:57

我同意马克·拜尔斯的观点。尝试使此方法泛型可能不是一个好主意。少量的代码重复并不会有什么坏处(只要它真的只有一点点)。事实上,你可以在你的通用版本中使用任何struct,这对我来说也不是一个好主意。

如果你真的想这样做,你可以尝试使用反射(就像Minustar建议的那样),但那样做既丑陋又慢。

相反,您可以使用Convert.ChangeType()

代码语言:javascript
复制
private T GetValue<T>(string str) where T : struct 
{
    return (T)Convert.ChangeType(str, typeof(T));
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10574504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档