gpt4 book ai didi

c# - TypeDescriptor CanConvertFrom 错误?还是我做错了?

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:58 26 4
gpt4 key购买 nike

这是从http://dnpextensions.codeplex.com/中取出的扩展方法.

我知道字符串“test”不是数字字符串...

我知道 GetConverter(targetType) 的类型是 int...

我不明白的是为什么它说它可以从字符串转换...但是它失败了...

/// <summary>
/// Converts an object to the specified target type or returns the default value.
/// </summary>
/// <typeparam name = "T"></typeparam>
/// <param name = "value">The value.</param>
/// <param name = "defaultValue">The default value.</param>
/// <returns>The target type</returns>
public static T ConvertTo<T>(this object value, T defaultValue)
{
if (value != null)
{
var targetType = typeof(T);
var valueType = value.GetType();

if (valueType == targetType) return (T)value;

var converter = TypeDescriptor.GetConverter(value);
if (converter != null)
{
if (converter.CanConvertTo(targetType))
return (T)converter.ConvertTo(value, targetType);
}

converter = TypeDescriptor.GetConverter(targetType);
if (converter != null)
{
if (converter.CanConvertFrom(valueType))
return (T)converter.ConvertFrom(value);
}
}
return defaultValue;
}

    [TestMethod]
public void TestConvertToWillFail()
{
// Arrange
var value = "test";

// Act
var result = value.ConvertTo<int>();

// Assert
result.Should().Equal(0);
result.Should().Not.Equal(value);
}

[TestMethod]
public void TestConvertToShouldPass()
{
// Arrange
var value = 123;
var stringValue = "123";

// Act
var stringResult = stringValue.ConvertTo<int>();

// Assert
stringResult.Should().Equal(value);
stringResult.Should().Not.Equal(0);
}

注意:Should() 来自 Should.codeplex.com


测试异常:

test is not a valid value for Int32.

最佳答案

你的方法在第二次调用中做的是:

  • 获取字符串转换器
  • 询问它是否可以转换为整数 - 它回答
  • 获取整数转换器
  • 询问它是否可以从字符串转换 - 它回答
  • 要求它转换提供的值(“test”)——这就是它爆炸的地方,因为“test”确实不是 Int32 的有效值。

CanConvertFrom/To 方法只是为了验证调用是否有意义,而不是转换是否成功,因为 CanConvert 仅在类型级别上工作

有些字符串会转换为有效整数,但这并不意味着所有字符串都是有效整数,所以 ConvertFrom/To 会抛出异常,即使 CanConvert 返回真。

关于c# - TypeDescriptor CanConvertFrom 错误?还是我做错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4448332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com