【问题标题】:Casting to an unknown type in a method [duplicate]在方法中转换为未知类型[重复]
【发布时间】:2018-04-18 10:49:18
【问题描述】:

我有一个获取两个参数的方法:第一个是要转换的类型,第二个是要转换的对象。 我试图像这样转换对象:

public static void method1(Type convertTo, object toBeConverted)
{
    toBeConverted = (convertTo)toBeConverted;
}

但是当我这样做时,我得到一个错误: “convertTo 是一个变量,但用作类型”。 我怎样才能使这个转换工作(不检查 convertTo 的类型并根据这种类型进行转换)?

【问题讨论】:

  • 你的意思是转换还是转换?
  • 对不起,我是说选角
  • 那个演员表有什么用?
  • 我得到了答案,谢谢!

标签: c#


【解决方案1】:

看起来你想要ChangeType 方法。例如

toBeConverted = Convert.ChangeType(toBeConverted, convertTo)

请注意,ChangeType 要求 toBeConverted 实现 IConvertible 接口。

或者,您可以使用TypeConverter

var converter = TypeDescriptor.GetConverter(convertTo);
toBeConverted = converter.ConvertFrom(toBeConverted);

这要求toBeConverted 有一个默认的TypeConverter,但这应该适用于可空类型。请注意,TypeConverters 有一个CanConvertFrom 方法,可让您在运行时确定是否支持转换。

这些不是唯一的方法,但上述方法在大多数情况下应该有效。如果您正在使用自定义类型,那么您必须实现自己的 TypeConverter 或酌情实现 IConvertible。如果考虑性能,那么它们不是最快的,但除非这是一个问题,否则我不会担心。

【讨论】:

  • 感谢您的帮助。如果 convert to 是可空类型怎么办? Convert.ChangeType 无法转换为可为空的类型。
  • @HilaB 我已经编辑了答案以包含 TypeConverter 这将适用于可空类型。
  • 非常感谢@bornfromanegg!
【解决方案2】:

您可以通过两种方式做到这一点 - 一种使用泛型,另一种使用 Convert

public static void method1(Type convertTo, object toBeConverted)
{
    var convertedValue = Convert.ChangeType(toBeConverted,convertTo);
}

public static void method2<TConvert>(object toBeConverted)
{
    var convertedValue = (TConvert)toBeConverted;
}

如果无法转换类型,这两种方法都会抛出异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多