不能做(表达式产生System.Type)对象强制转换?

时间:2012-01-28 01:38:36

标签: c#

我有一个object []数组,其中包含一些内置类型的混合,比如Int / Byte / String,我试图在运行时从对象转换为正确的类型,然后将该转换的数据交给a具有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)

我正在尝试在3rdPartyLibrary和我的其余代码之间抽象一层

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

我正在尝试做一些简单的看似,像这样(伪造的)

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

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

2 个答案:

答案 0 :(得分:1)

强制转换是编译时构造;你不能在强制转换操作符中使用调用的结果。

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

如果您使用的是.NET 4:

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

否则,你必须使用反射根据参数类型选择正确的重载,然后调用它。

答案 1 :(得分:1)

你正在寻找的东西是没有意义的,因为结果仍然必须为所有操作都有一个类型,并且必须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 + "'.");
}