相关疑难解决方法(0)

如何将字符串解析为可空的int

我想在C#中将字符串解析为可以为空的int.即.我想要返回字符串的int值,如果无法解析,则返回null.

我有点希望这会奏效

int? val = stringVal as int?;
Run Code Online (Sandbox Code Playgroud)

但这不起作用,所以我现在这样做的方式是我写了这个扩展方法

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;
        }
    }
}   
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

编辑: 感谢TryParse的建议,我确实知道这一点,但它的结果大致相同.我更感兴趣的是知道是否有一个内置的框架方法可以直接解析为可以为空的int?

.net c# string nullable .net-3.5

288
推荐指数
9
解决办法
15万
查看次数

通用TryParse

我正在尝试创建一个通用扩展,使用'TryParse'来检查字符串是否是给定类型:

public static bool Is<T>(this string input)
{
    T notUsed;
    return T.TryParse(input, out notUsed);
}
Run Code Online (Sandbox Code Playgroud)

这将无法编译,因为它无法解析符号'TryParse'

据我了解,'TryParse'不是任何界面的一部分.

这有可能吗?

更新:

使用下面的答案,我想出了:

public static bool Is<T>(this string input)
{
    try
    {
        TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
    }
    catch
    {
        return false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

它运作得很好,但我认为以这种方式使用异常对我来说感觉不对.

UPDATE2:

修改为传递类型而不是使用泛型:

public static bool Is(this string input, Type targetType)
{
    try
    {
        TypeDescriptor.GetConverter(targetType).ConvertFromString(input);
        return true;
    }
    catch
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# generics tryparse

191
推荐指数
7
解决办法
7万
查看次数

如何解决这个问题,以便将通用转换为Nullable <T>?

我目前使用这个方便的转换扩展方法来进行类型之间的转换:

    public static T To<T>(this IConvertible obj)
    {
        return (T)Convert.ChangeType(obj, typeof(T));
    }
Run Code Online (Sandbox Code Playgroud)

但是,它不喜欢将有效值转换为Nullable,例如,这会失败:

    "1".To<int?>();
Run Code Online (Sandbox Code Playgroud)

显然,1很容易转换为(int?),但它得到错误:

    Invalid cast from 'System.String' to 'System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
Run Code Online (Sandbox Code Playgroud)

这是一个明显简化的例子,实际上我用它来做字符串类型的转换,如下所示:

packageDb.Quantity = package.package.ElementDeep(Namespace + "PackageQuantity", Namespace + "ActualQuantity", Namespace + "Quantity").ValueOrNull().To<int?>();
Run Code Online (Sandbox Code Playgroud)

如果Convert.ChangeType不喜欢Nullable,那么任何人都有什么好主意吗?

c# nullable

46
推荐指数
2
解决办法
2万
查看次数

如何将字符串转换为在运行时确定的可为空类型?

我有下面的代码,我需要将一个字符串转换为一个也从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);
Run Code Online (Sandbox Code Playgroud)

我得到以下错误消息:

Invalid cast from 'System.String' to 'System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
Run Code Online (Sandbox Code Playgroud)

怎么会很好的可能?

我知道一种丑陋的方法是使用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);
    }
Run Code Online (Sandbox Code Playgroud)

会有更好的方法吗?

谢谢,

c# asp.net generics datetime nullable

16
推荐指数
2
解决办法
2万
查看次数

TryParse为可空类型

我想尝试将a解析string为a DateTime?,如果失败则将值设置为null.我能想到的唯一方法就是如下,但它看起来并不是很整洁.

DateTime temp;
DateTime? whatIActuallyWant = null;
if (DateTime.TryParse(txtDate.Text, out temp)) whatIActuallyWant = temp;
Run Code Online (Sandbox Code Playgroud)

这是唯一的方法吗?

.net c# null nullable tryparse

14
推荐指数
2
解决办法
9651
查看次数

'String'的值不能转换为Type'T'.获取查询字符串的通用函数?

我有这个功能:

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
Run Code Online (Sandbox Code Playgroud)

我希望这样称呼:

Dim userId As Integer = SessionUtil.GetSessionValue(Of Integer)("uid")
Run Code Online (Sandbox Code Playgroud)

我试图使它成为通用的,因为最后查询字符串值可能至少是一个整数或一个字符串,但也可能是一个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)
Run Code Online (Sandbox Code Playgroud)

.net vb.net generics type-conversion query-string

11
推荐指数
2
解决办法
4560
查看次数

创建将字符串转换为可空数字的通用方法

我有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 …
Run Code Online (Sandbox Code Playgroud)

.net vb.net extension-methods

6
推荐指数
1
解决办法
1695
查看次数

一般的TryParse Nullable类型

我已经写了重载的静态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)
{ …
Run Code Online (Sandbox Code Playgroud)

.net c# generics parsing type-conversion

6
推荐指数
2
解决办法
8483
查看次数