Inv*_*nda 6 c# reflection casting
我正在使用一些遗留代码,它们通常使用try+ catch与Convert.ToDecimal(someString)(例如)结合使用来尝试将字符串转换为小数.出于某些原因,我必须使用这样的设置 - 在调试时 - 我停在每个抛出的异常(不仅是用户未处理的异常),所以这很烦人,我改变它以TryParse尽可能使用方法.
现在我处在一个object有价值和目标的情况下Type,我想知道的是我是否可以将值转换为目标类型.现在这样做如下:
try
{
Convert.ChangeType(val, targetType);
}
catch
{
// Do something else
}
Run Code Online (Sandbox Code Playgroud)
实际结果并不重要,不再使用.
虽然这个代码现在正在运行,正如我所说,它有点烦人,所以我想知道:有没有其他方法可以做到上述而不必捕获异常?
我想到了类似于IsAssignableFroma 的东西Type,但这似乎并不适用于我的情况(我不想分配,我想知道是否可以明确转换).
如果你的意思是铸造,那么你可以使用is如下关键字:
object someObject = GetSomeObject();
if (someObject is string)
{
..
}
Run Code Online (Sandbox Code Playgroud)
但请注意,铸造和铸造Convert.ChangeType并不相同。例如,您不能将字符串转换为 int:
string numberString = "15";
int number = (int)numberString;
Run Code Online (Sandbox Code Playgroud)
但你可以用ChangeType它:
string numberString = "15";
int number = (int)Convert.ChangeType(numberString, typeof(int));
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您需要测试变量是否可转换为特定类型,那么为什么不直接将try-catchwith包装Convert.ChangeType到测试方法中:
public bool IsConvertibleTo<T>(object value)
{
try
{
T convertedValue = (T)Convert.ChangeType(value, typeof(T));
return true;
}
catch (InvalidCastException)
{
return false;
}
catch (FormatException)
{
return false;
}
catch (OverflowException)
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)