我必须实现this功能:
protected override ValidationResult IsValid(
Object value,
ValidationContext validationContext
)
{
//Here is where I wanna test whether the following conversion is applicable
var x = Convert.ToInt64(value);
}
我可以在try-catch块中包装该行,或者使用其他方式来执行该测试,这是其中之一:
var convertible = value as IConvertible;
if (convertible != null)
var x = convertible.ToInt64(null);
最有效的方法是什么?
答案 0 :(得分:3)
这里你可以定义一个默认值,如果解析(转换)适用它将返回转换后的int64,否则将返回默认值:
Int64 DefaultValue = 0;
Int64.TryParse(MyVar , out DefaultValue);
即:
Int64 DefaultValue = 0;
Int64.TryParse("1234" , out DefaultValue);
DefaultValue将为1234
Int64 DefaultValue = 0;
Int64.TryParse("test" , out DefaultValue);
DefaultValue将为0
答案 1 :(得分:0)
Int64.TryParse()怎么样?当然你需要.ToString()
你的value
param,否则我认为这会有效。
答案 2 :(得分:0)
使用IConvertible
似乎是最佳选择。
我做了一个简短的测试,以验证我的方式更快,似乎是更快(6倍!)更快,你也承认通过使用IConvertible
,代码也看起来很多更干净,更简洁。
static void Main(string[] args)
{
var sw = new Stopwatch();
sw.Start();
for (short i = 0; i < short.MaxValue; i++)
{
var foo = IsValid1(i);
}
sw.Stop();
var result1 = sw.Elapsed;
Console.WriteLine(result1);
sw.Start();
for (short i = 0; i < short.MaxValue; i++)
{
var foo = IsValid2(i);
}
sw.Stop();
var result2 = sw.Elapsed;
Console.WriteLine(result2);
Console.ReadKey();
}
static bool IsValid1(object value)
{
var convertible = value as IConvertible;
if (convertible != null)
return convertible.ToInt64(null) != 0;
return true;
}
static bool IsValid2(object value)
{
if (value != null)
{
long amount;
if (long.TryParse(value.ToString(), out amount))
return amount != 0;
}
return true;
}
输出:
00:00:00.0031987
00:00:00.0186700