可以';t do(生成System.Type的表达式)对象强制转换

本文关键字:表达式 对象 转换 Type System do 生成 可以 | 更新日期: 2023-09-27 18:21:55

我有一个object[]数组,它包含一些内置类型的混合,如Int/Byte/String,我试图在运行时将对象转换为正确的类型,然后将转换的数据交给具有Write(内置类型重载)方法的第三方库。

我以为我可以只做Obj.Write((产生System.Type的表达式)objArg),但它在我身上出错了。

这里有一个代码示例可以更好地解释它:

    object testData = (int)42;
    int final = (GetAType())testData;
    private Type GetAType()
    {
        return typeof(Int32);
    }

有什么建议吗?实现这一点的其他方法也会有所帮助。

在某种背景下,这是我最初的问题。第三方库,有一堆不同类型的重载。

3rdPartyLibrary.Write(bool source)
3rdPartyLibrary.Write(int16 source)
3rdPartyLibrary.Write(int32 source)
3rdPartyLibrary.Write(string source)

我试图在第三方库和我的代码的其余部分之间抽象一层

Such that I can have
Object[int32]
Object[int16]
Object[string]
Object[int32]

我正在尝试做一些看起来很简单的事情,比如这个(psuedo编码)

loop Object[]
{
  3rdPartyLibrary.Write( (object[i].GetType()) object[i] )
}

我一直在读所有听起来类似的问题,看起来这可能不可能?

可以';t do(生成System.Type的表达式)对象强制转换

您正在寻找的内容将毫无意义,因为结果仍然必须为所有操作指定一个类型,并且必须是object才能处理所有不同的类型。

只需为您支持的类型使用开关:

foreach (object item in Object) {
  switch (item.GetType().Name) {
    case "System.Int16":
      3rdPartyLibrary.Write((Int16)item);
      break;
    case "System.Int32":
      3rdPartyLibrary.Write((Int32)item);
      break;
    case "System.Boolean":
      3rdPartyLibrary.Write((bool)item);
      break;
    case "System.String":
      3rdPartyLibrary.Write((string)item);
      break;
    default:
      throw new ArgumentException("Unhandled type '" + item.GetType().Name + "'.");
}

Cast是编译时构造;不能在强制转换运算符中使用调用的结果。

有两种方法可以解决你的问题。

如果您使用的是.NET4:

3rdPartyLibrary.Write((dynamic)object[i]);

否则,您将不得不使用反射根据参数类型选择正确的重载,然后调用它。