我正在尝试使用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 []'。存在显式转换(您是否错过了演员?)
答案 0 :(得分:0)
但它一直给我RuntimeBinderException:
无法将类型'object'隐式转换为'PodperneZarizeniTypeZaznamObjektu []'。存在显式转换(您是否错过了演员?)
根本看起来不像运行时异常。这看起来像编译时错误。
在评论中,您说singleSet.ZaznamyObjektu
的类型为
PodperneZarizeniTypeZaznamObjektu[]
。 Activator.CreateInstance
会返回object
,请注意CreateInstance
对任何类型都有潜在效力。您无法将object
分配给数组类型的属性。
你的问题似乎是你只是错过了演员:
singleSet.ZaznamyObjektu = (PodperneZarizeniTypeZaznamObjektu[])Activator.CreateInstance(arrayType, new object[] { rowCount });
现在,请注意,在以下情况下,这将失败:
arrayField
是引用类型,并且在arrayField
和PodperneZarizeniTypeZaznamObjektu
之间没有有效的身份保留引用转换。
(Mammal[])tigers; //valid
(Insect[])tigers; //evidently not.
arrayField
是值类型,其类型不是PodperneZarizeniTypeZaznamObjektu
的类型。即使存在隐式/显式转换运算符,它也会失败;值类型不允许使用数组类型方差。
(long[])(ints); //not valid even though an implicit cast
//from int to long exists