nasıl

2012-05-21 4 views
9

ben bir parametre olarak object[] beklediği bir COM fonksiyonu var C# [] nesne System.Array dönüştürebilirim :nasıl

"Unable to cast object of type `SomeEnumType[]' to type 'system.Object[]'.

: I foo(...) için fields geçmek çalışırken

object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType)); 

Ancak [foo(fields)] bir hata olsun, yani

Neyi yanlış yaptığımı söyleyen var mı?

cevap

20

Kural dışı durum şöyle diyor: SomeEnumType[] kodunu object[] olarak değiştiremiyorsunuz; eski, her değerin SomeEnumType değeri olduğu bir dizidir; İkincisi, her öğenin bir referans olduğu bir dizidir.

object[] fields = Enum.GetValues(typeof(SomeEnumType)) 
         .Cast<object>() 
         .ToArray(); 

Bu temelde bir IEnumerable<object> oluşturmak için her elemanını (her numaralama değeri) kutu, daha sonra bundan bir dizi oluşturmak:

LINQ ile kolayca yeterli bir yeni dizi oluşturabilirsiniz. Tilak'ın yaklaşımına benzer, ama aslında genel amaçlı bir projeksiyona ihtiyacım olmadığı zaman Cast kullanmayı tercih ediyorum. Alternatif olarak

:

Aslında
SomeEnumType[] values = (SomeEnumType[]) Enum.GetValues(typeof(SomeEnumType)); 
object[] fields = Array.ConvertAll(values, x => (object) x); 
2

Uygun dizi türünü yüklemeniz gerekir.

object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray(); 

hata mesajı fonksiyonu "nesne" türünde bir nesne dizisi bekliyor ve siz "SomeEnumType" türü birinde geçiyoruz belirten, bu nedenle bir tür uyumsuzluğu vardır: bu satırlar boyunca bir şey deneyin .

+0

. Geliştirici işaret ettiği gibi, Array bir nesne, bir C++ stili [] dizisi değil. – user978122

+0

Doğru - C++ arka plandan geliyorum: eski alışkanlıklar zorlu ölüyor :) –

4
Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray() 
+0

Enum.GetValues ​​(...) System.Array öğesini döndürür, Select (...) uzantısı yok ... –

+0

Teşekkürler. aralarında cevapsız kaldım. – Tilak