我想在C#中将字符串解析为可以为空的int.即.我想要返回字符串的int值,如果无法解析,则返回null.
我有点希望这会奏效
int? val = stringVal as int?;
但这不起作用,所以我现在这样做的方式是我写了这个扩展方法
public static int? ParseNullableInt(this string value)
{
    if (value == null || value.Trim() == string.Empty)
    {
        return null;
    }
    else
    {
        try
        {
            return int.Parse(value);
        }
        catch
        {
            return null;
        }
    }
}   
有没有更好的方法呢?
编辑: 感谢TryParse的建议,我确实知道这一点,但它的结果大致相同.我更感兴趣的是知道是否有一个内置的框架方法可以直接解析为可以为空的int?
我正在尝试创建一个通用扩展,使用'TryParse'来检查字符串是否是给定类型:
public static bool Is<T>(this string input)
{
    T notUsed;
    return T.TryParse(input, out notUsed);
}
这将无法编译,因为它无法解析符号'TryParse'
据我了解,'TryParse'不是任何界面的一部分.
这有可能吗?
更新:
使用下面的答案,我想出了:
public static bool Is<T>(this string input)
{
    try
    {
        TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
    }
    catch
    {
        return false;
    }
    return true;
}
它运作得很好,但我认为以这种方式使用异常对我来说感觉不对.
UPDATE2:
修改为传递类型而不是使用泛型:
public static bool Is(this string input, Type targetType)
{
    try
    {
        TypeDescriptor.GetConverter(targetType).ConvertFromString(input);
        return true;
    }
    catch
    {
        return false;
    }
}
我目前使用这个方便的转换扩展方法来进行类型之间的转换:
    public static T To<T>(this IConvertible obj)
    {
        return (T)Convert.ChangeType(obj, typeof(T));
    }
但是,它不喜欢将有效值转换为Nullable,例如,这会失败:
    "1".To<int?>();
显然,1很容易转换为(int?),但它得到错误:
    Invalid cast from 'System.String' to 'System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
这是一个明显简化的例子,实际上我用它来做字符串类型的转换,如下所示:
packageDb.Quantity = package.package.ElementDeep(Namespace + "PackageQuantity", Namespace + "ActualQuantity", Namespace + "Quantity").ValueOrNull().To<int?>();
如果Convert.ChangeType不喜欢Nullable,那么任何人都有什么好主意吗?
我有下面的代码,我需要将一个字符串转换为一个也从String指定的类型:
 Type t = Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");
            object d = Convert.ChangeType("2012-02-23 10:00:00", t);
我得到以下错误消息:
Invalid cast from 'System.String' to 'System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
怎么会很好的可能?
我知道一种丑陋的方法是使用if来检查类型是否可以为空:
    Type possiblyNullableType = Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");
    var underlyingType = Nullable.GetUnderlyingType(possiblyNullableType);
    Object result;
    // if it's null, it means it wasn't nullable
    if (underlyingType != null)
    {
        result = Convert.ChangeType("2012-02-23 10:00:00", underlyingType);
    }
会有更好的方法吗?
谢谢,
我想尝试将a解析string为a DateTime?,如果失败则将值设置为null.我能想到的唯一方法就是如下,但它看起来并不是很整洁.
DateTime temp;
DateTime? whatIActuallyWant = null;
if (DateTime.TryParse(txtDate.Text, out temp)) whatIActuallyWant = temp;
这是唯一的方法吗?
我有这个功能:
Public Shared Function GetQueryStringValue(Of T As Structure)(ByVal queryStringVariable As String) As T
        Dim queryStringObject As Nullable(Of T) = Nothing
        If queryStringVariable <> Nothing Then
            If HttpContext.Current.Request.QueryString(queryStringVariable) IsNot Nothing Then
                queryStringObject = DirectCast(HttpContext.Current.Request.QueryString(queryStringVariable), T)
            End If
        End If
        Return queryStringObject
End Function
我希望这样称呼:
Dim userId As Integer = SessionUtil.GetSessionValue(Of Integer)("uid")
我试图使它成为通用的,因为最后查询字符串值可能至少是一个整数或一个字符串,但也可能是一个double和其他.但我得到错误:
Value of 'String' cannot be converted to Type 'T'
我用Session变量完成了同样的事情并且它有效.有人知道如何使这项工作?
编辑:下面的乔纳森艾伦有一个更简单的答案使用CObj()或CTypeDynamic().但是下面也可以从Convert string到nullable类型(int,double等等)
Dim conv As TypeConverter = TypeDescriptor.GetConverter(GetType(T))
queryStringObject = DirectCast(conv.ConvertFrom(queryStringVariable), T)
我有3个类似的功能,只根据数字类型改变:
<Extension()> _
Public Function ToNullableShort(ByVal str As String) As Short?
    Dim intReturn As Short
    If Short.TryParse(str, intReturn) Then
        Return intReturn
    Else
        Return Nothing
    End If
End Function
<Extension()> _
Public Function ToNullableByte(ByVal str As String) As Byte?
    Dim intReturn As Byte
    If Byte.TryParse(str, intReturn) Then
        Return intReturn
    Else
        Return Nothing
    End If
End Function
<Extension()> _
Public Function ToNullableLong(ByVal str As String) As Long?
    Dim intReturn As Long
    If Long.TryParse(str, intReturn) Then
        Return intReturn
    Else
        Return Nothing
    End If …我已经写了重载的静态TryParse方法如下Nullable类型:int?,short?,long?,double?,DateTime?,decimal?,float?,bool?,byte?和char?.以下是一些实现:
protected static bool TryParse(string input, out int? value)
{
    int outValue;
    bool result = Int32.TryParse(input, out outValue);
    value = outValue;
    return result;
}
protected static bool TryParse(string input, out short? value)
{
    short outValue;
    bool result = Int16.TryParse(input, out outValue);
    value = outValue;
    return result;
}
protected static bool TryParse(string input, out long? value)
{ …