【问题标题】:RuntimeBinderException when trying to instantiate an array of a dynamic type (late-binding)尝试实例化动态类型的数组时出现 RuntimeBinderException(后期绑定)
【发布时间】:2018-04-22 22:30:49
【问题描述】:

我正在尝试使用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[]”。存在显式转换(您是否缺少演员表?)

【问题讨论】:

  • singleSet.ZaznamyObjektu的类型是什么?
  • PodperneZarizeniTypeZaznamObjektu[]

标签: c# arrays dynamic late-binding activator


【解决方案1】:

但它一直给我 RuntimeBinderException:

无法将类型“object”隐式转换为“PodperneZarizeniTypeZaznamObjektu[]”。存在显式转换(您是否缺少演员表?)

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

在 cmets 中,您说singleSet.ZaznamyObjektu 的类型是 PodperneZarizeniTypeZaznamObjektu[]Activator.CreateInstance 返回 object,请记住 CreateInstance 对于 any 类型可能有效。您不能将 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
    

【讨论】:

猜你喜欢
  • 2015-12-20
  • 1970-01-01
  • 2013-10-24
  • 2013-11-25
  • 1970-01-01
  • 2019-09-11
  • 2018-08-26
  • 2013-04-10
  • 2013-02-07
相关资源
最近更新 更多