我正在尝试创建一个通用扩展,使用'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) Parse()和TryParse()有什么区别?
int number = int.Parse(textBoxNumber.Text);
// The Try-Parse Method
int.TryParse(textBoxNumber.Text, out number);
Run Code Online (Sandbox Code Playgroud)
是否有某种形式的错误检查,如Try-Catch Block?
我有以下日期的字符串格式"2011-29-01 12:00 am".现在我尝试使用以下代码将其转换为datetime格式:
DateTime.TryParse(dateTime, out dt);
Run Code Online (Sandbox Code Playgroud)
但我总是在{1/1/0001 12:00:00 AM}获得dt,你能告诉我为什么吗?以及如何将该字符串转换为日期.
编辑:我刚看到提到的每个人都使用格式参数.我现在要提到我不能使用format参数,因为我有一些设置来选择用户想要的自定义dateformat,并且基于该用户能够通过jQuery datepicker自动以该格式获取文本框中的日期.
我知道......我知道......性能不是这里的主要关注点,但只是出于好奇,哪个更好?
bool parsed = int.TryParse(string, out num);
if (parsed)
...
Run Code Online (Sandbox Code Playgroud)
要么
try {
int.Parse(string);
}
catch () {
do something...
}
Run Code Online (Sandbox Code Playgroud) 在使用Enum.TryParse时,我遇到了一种我没想到的行为.
如果我有一个枚举:
public enum MyEnum
{
ValueA,
ValueB,
ValueC
}
Run Code Online (Sandbox Code Playgroud)
然后我将一个数值(作为一个字符串)传递给Enum.TryParse,如:
MyEnum outputEnum;
bool result = Enum.TryParse("1234", out outputEnum);
Run Code Online (Sandbox Code Playgroud)
尽管字符串"1234"不是可能的值,但结果将返回true,而我的outputEnum将具有值1234.
有没有办法可以避免这种行为?我正在尝试编写一个函数,它将任意字符串输入作为枚举处理,这在我的错误输入检测中引发了一些麻烦.
我经常使用Request.QueryString[]
变量.
在我Page_load
经常做的事情:
int id = -1;
if (Request.QueryString["id"] != null) {
try
{
id = int.Parse(Request.QueryString["id"]);
}
catch
{
// deal with it
}
}
DoSomethingSpectacularNow(id);
Run Code Online (Sandbox Code Playgroud)
这一切似乎有点笨拙和垃圾.你怎么处理你Request.QueryString[]
的?
UPDATE
Guid.TryParse在.NET 4.0中可用
结束更新
显然,.NET CLR 2.0中没有公共GUID.TryParse().
所以,我正在寻找正则表达式[也称为google搜索一个],每次我发现其中有一个激烈的论点在评论部分关于RegEx A不起作用,使用RegEx B.然后有人会写Regex C yadda yadda
所以无论如何,我决定做的就是这个,但我对它感到很难过.
public static bool IsGuid (string possibleGuid) {
try {
Guid gid = new Guid(possibleGuid);
return true;
} catch (Exception ex) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
显然我并不喜欢这个,因为从第一天开始我一直在钻我,以避免抛出异常,如果你可以防范代码.
有谁知道为什么.NET Framework中没有公共的Guid.TryParse()?
有没有人有一个真正的正则表达式,适用于所有GUID?
我只想知道,String变量是否包含可解析的正整数值.我现在不想解析这个值.
目前我在做:
int parsedId;
if (
(String.IsNullOrEmpty(myStringVariable) ||
(!uint.TryParse(myStringVariable, out parsedId))
)
{//..show error message}
Run Code Online (Sandbox Code Playgroud)
这很难看 - 如何更简洁?
注意:我知道扩展方法,但我想知道是否有内置的东西.
我发现很多次我不需要TryParse方法的out参数,但问题是必然的.在这里,我将展示一个不需要的例子.
我想检查字符串是否为整数,如果是整数则打印"整数"; 否则,打印"不是整数".所以这是代码:
string value = Console.ReadLine(); //Get a value from the user.
int num; //Why should I have it?? No need at all !
if (int.TryParse(value, out num))
{
Console.WriteLine("An integer");
}
else
{
Console.WriteLine("Not an integer");
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道为什么TryParse总是返回一个out参数?为什么没有out参数就没有过载?
我发现自己经常需要使用Integer.TryParse来测试值是否为整数.但是,当你使用TryParse时,你必须将一个引用变量传递给函数,所以我发现自己总是需要创建一个空白整数来传入.通常它看起来像:
Dim tempInt as Integer
If Integer.TryParse(myInt, tempInt) Then
Run Code Online (Sandbox Code Playgroud)
考虑到我想要的只是一个简单的真/假响应,我觉得这很麻烦.有没有更好的方法来解决这个问题?为什么没有一个重载函数,我可以传递我想要测试的值并获得真/假响应?