2017-02-25 56 views
5

Farklı veri türleri kullanarak bildirilebilecek bir veri dizisini döndürmek için genel bir kapsayıcı olarak object kullanan bir C# yöntemim var. Böyle bir yöntemin basitleştirilmiş örnek Aşağıda:C# genel bir nesne olarak döndürülen bir diziyi farklı bir temel türüne döndürme

void GetChannelData(string name, out object data) 
{ 
    // Depending on "name", the underlying type of 
    // "data" can be different: int[], byte[], float[]... 
    // Below I simply return int[] for the sake of example 
    int[] intArray = { 0, 1, 2, 3, 4, 5 }; 
    data = intArray; 
} 

Bütün dönen dizi double için elemanlarını ama şu ana kadar bir yol bulamadım dönüştürmek gerekir. ConvertAll Zamanında tanımlanan türlerini kabul etmez çünkü sefil başarısız

object objArray; 
GetChannelData("test", out objArray); 
double[] doubleArray = Array.ConvertAll<objArray.GetType().GetElementType(), double>(objArray, item => (double)item); 

: İdeal gibi bir şey yapmak istiyorum. Ayrıca, dynamic değişkenine ara dönüşümler denemedim.

Böyle bir tür dönüşümü basit bir şekilde gerçekleştirmenin bir yolu var mı?

+1

Verilen tüm yanıtlar iyi çalışıyor; @AlexWiese sürümünü, AnyName'den önce bu tür bir çözüm sağladığından doğru cevabı kabul etti. Hepinize teşekkürler! – Metal76

cevap

4

Derleme zamanında türü bilmiyorsanız, bunu dönüştürmeyi deneyebilirsiniz.

var array = (IEnumerable)objArray; 
var doubles = array.OfType<object>().Select(a => Convert.ToDouble(a)).ToArray(); 
3

Eğer derleme sırasında dizi öğelerinin türü bilmiyorsanız: u uzatma yöntemi oluşturabilir

var doubleArray = (objArray as Array).OfType<object>() 
    .Select(m => Convert.ToDouble(m)).ToArray(); 
+0

Evet, maalesef kütüphane metodu bir 'object' değil bir' object [] 'döndürüyor, yani' Select' geçerli değil. – Metal76

+0

@Nkosi Bunu fark etmedim. Cevabımı yeni güncelledim. –

+0

@AnyName, güzel bir yol ama aslında 'int' derleme zamanında dönüştürürken, ben sadece bir tür GetType()' ile çalışma zamanında temel türünü okuyabiliyorum. Belki de benim örneğim% 100 açık değil, onu daha net görebilmem için düzenlemeye çalışacağım. – Metal76

1

..

 public static IEnumerable<T> Convert<T>(this IEnumerable source) 
     { 
      foreach (var item in source) 
       yield return (T)System.Convert.ChangeType(item, typeof(T)); 
     } 

kullanarak ..

 object objArray; 
     GetChannelData("test", out objArray); 
     var array = (IEnumerable)objArray; 
     var doubleArray = array.Convert<double>().ToArray(); 
İlgili konular