我使用以下代码验证来自ajax调用的收入数字:
public Tuple<bool, int> ValidateInt(string TheCandidateInt)
{
int TheInt = 0;
if (Int32.TryParse(TheCandidateInt, out TheInt))
{
return new Tuple<bool, int>(true, TheInt);
}
else
{
return new Tuple<bool, int>(false, 0);
}
}
public Tuple<bool, short> ValidateShort(string TheCandidateShort)
{
short TheShort = 0;
if (Int16.TryParse(TheCandidateShort, out TheShort))
{
return new Tuple<bool, short>(true, TheShort);
}
else
{
return new Tuple<bool, short>(false, 0);
}
}
我对Byte
和Short
也有相同类型的功能。正如你所看到的,我传入一个字符串,返回的是一个元组,其中Item1是一个布尔值,而Item2是一个值。
有没有办法将这4个方法改为1并以某种方式分解出解析的数据类型?
感谢。
答案 0 :(得分:2)
您可以使用泛型将方法合并为一个:
public static Tuple<bool, T> ValidateValue<T>(string input) where T : struct
{
T result = default(T);
try
{
result = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
}
catch
{
return new Tuple<bool, T>(false, result);
}
return new Tuple<bool, T>(true, result);
}
至于分解解析的数据类型,您仍然必须将其指定为通用参数。
ValidateValue<byte>("255");
答案 1 :(得分:0)
您可以创建一个封装TryParse调用的委托,并创建一个更通用的验证方法版本。以下示例显示了大纲:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestTryParseDelegate
{
class Program
{
private delegate bool TryParseDelegate<T>(string candidate, out T result)
where T : struct;
private static Tuple<bool, T> Validate<T>(string candidate, TryParseDelegate<T> tryParseDel)
where T : struct
{
T result;
return Tuple.Create(tryParseDel(candidate, out result), result);
}
public static Tuple<bool, int> ValidateInt(string TheCandidateInt)
{
return Validate<int>(TheCandidateInt, int.TryParse);
}
public static void Main()
{
var result = ValidateInt("123");
Console.WriteLine(result);
}
}
}
我仍然建议将常规版本封装在您的示例中的专用方法中,因为委托是您可能不想发布的实现细节。