更优雅的方法,找出我是否可以将值转换为某种类型

Inv*_*nda 6 c# reflection casting

我正在使用一些遗留代码,它们通常使用try+ catchConvert.ToDecimal(someString)(例如)结合使用来尝试将字符串转换为小数.出于某些原因,我必须使用这样的设置 - 在调试时 - 我停在每个抛出的异常(不仅是用户未处理的异常),所以这很烦人,我改变它以TryParse尽可能使用方法.

现在我处在一个object有价值和目标的情况下Type,我想知道的是我是否可以值转换为目标类型.现在这样做如下:

try
{
  Convert.ChangeType(val, targetType);
}
catch
{
  // Do something else
}
Run Code Online (Sandbox Code Playgroud)

实际结果并不重要,不再使用.

虽然这个代码现在正在运行,正如我所说,它有点烦人,所以我想知道:有没有其他方法可以做到上述而不必捕获异常?

我想到了类似于IsAssignableFroma 的东西Type,但这似乎并不适用于我的情况(我不想分配,我想知道是否可以明确转换).

Dmi*_*nko 4

如果你的意思是铸造,那么你可以使用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)