尝试实例化动态类型的数组时遇到RuntimeBinderException(后期绑定)

时间:2017-11-09 19:36:52

标签: c# arrays dynamic late-binding activator

我正在尝试使用Activator.CreateInstance()来实例化一个包含动态类型字段的数组(我在运行时期间得到的数组字段必须使用的类型为Type arrayType = arrayFieldType.MakeArrayType())。

singleSet.ZaznamyObjektu = Activator.CreateInstance(arrayType, new object[] { rowCount });

rowCount是一个整数。)我根据How do I create a C# array using Reflection and only type info?选择了这种方法,但它一直给我RuntimeBinderException:

  

无法将类型'object'隐式转换为'PodperneZarizeniTypeZaznamObjektu []'。存在显式转换(您是否错过了演员?)

但是当我无法使用该类型的确切名称时,我不知道如何进行强制转换或转换。我也试过使用Array.CreateInstance(),但它给了我类似的例外:

  

无法将类型'System.Array'隐式转换为'PodperneZarizeniTypeZaznamObjektu []'。存在显式转换(您是否错过了演员?)

1 个答案:

答案 0 :(得分:0)

  

但它一直给我RuntimeBinderException:

     

无法将类型'object'隐式转换为'PodperneZarizeniTypeZaznamObjektu []'。存在显式转换(您是否错过了演员?)

根本看起来不像运行时异常。这看起来像编译时错误。

在评论中,您说singleSet.ZaznamyObjektu的类型为 PodperneZarizeniTypeZaznamObjektu[]Activator.CreateInstance会返回object,请注意CreateInstance任何类型都有潜在效力。您无法将object分配给数组类型的属性。

你的问题似乎是你只是错过了演员:

singleSet.ZaznamyObjektu = (PodperneZarizeniTypeZaznamObjektu[])Activator.CreateInstance(arrayType, new object[] { rowCount });

现在,请注意,在以下情况下,这将失败:

  1. arrayField引用类型,并且在arrayFieldPodperneZarizeniTypeZaznamObjektu之间没有有效的身份保留引用转换。

    (Mammal[])tigers; //valid
    (Insect[])tigers; //evidently not.
    
  2. arrayField值类型,其类型不是PodperneZarizeniTypeZaznamObjektu的类型。即使存在隐式/显式转换运算符,它也会失败;值类型不允许使用数组类型方差。

    (long[])(ints); //not valid even though an implicit cast
                    //from int to long exists