2017-02-25 13 views
5

Tôi có phương thức C# sử dụng object làm vùng chứa chung để trả về mảng dữ liệu có thể khai báo bằng các kiểu dữ liệu khác nhau. Dưới đây là một ví dụ đơn giản của một phương pháp như:C# chuyển đổi một mảng được trả về dưới dạng đối tượng chung thành kiểu cơ bản khác

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; 
} 

tôi cần phải chuyển đổi tất cả các phần tử mảng trở lại double nhưng cho đến nay tôi không thể tìm thấy một cách. Lý tưởng nhất là tôi muốn thực hiện một cái gì đó như:

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

Lỗi không đúng vì ConvertAll không chấp nhận các loại được xác định khi chạy. Tôi cũng đã thử chuyển đổi trung gian thành biến số dynamic, không có kết quả.

Có cách nào để thực hiện chuyển đổi loại như vậy theo cách đơn giản không?

+1

Tất cả các câu trả lời được cung cấp đều hoạt động tốt; đã chấp nhận phiên bản @AlexWiese là câu trả lời chính xác khi anh ấy cung cấp giải pháp đó trước AnyName. Cảm ơn tất cả các bạn! – Metal76

Trả lời

4

Nếu bạn không biết loại lúc biên dịch, bạn có thể thử chuyển đổi nó.

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

Nếu bạn không biết loại phần tử mảng tại thời gian biên dịch:

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

Có, không may phương thức thư viện trả về một 'đối tượng' và không phải là một' đối tượng [] ', do đó,' Chọn' không áp dụng. – Metal76

+0

@Nkosi Tôi không nhận thấy điều đó. Tôi vừa cập nhật câu trả lời của mình. –

+0

@AnyName, cách tốt đẹp nhưng bạn thực sự chuyển đổi thành 'int' tại thời gian biên dịch, trong khi tôi chỉ có thể đọc kiểu cơ bản trong thời gian chạy với' GetType() '. Có lẽ ví dụ của tôi không rõ ràng 100%, tôi sẽ cố gắng chỉnh sửa nó để nó rõ ràng hơn – Metal76

1

u có thể tạo ra phương pháp khuyến nông ..

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

sử dụng ..

 object objArray; 
     GetChannelData("test", out objArray); 
     var array = (IEnumerable)objArray; 
     var doubleArray = array.Convert<double>().ToArray(); 
Các vấn đề liên quan