2012-05-24 46 views
38

Tôi đang cố chuyển đổi một đối tượng (được khai báo ở đây là 'obj': đối tượng là mảng, nguyên thủy) thành mảng chuỗi.đối tượng vào mảng chuỗi

đối tượng có thể được bất cứ điều gì uint [], int16 [], vv

Tôi đã cố gắng sử dụng

string[] str = Array.ConvertAll<object, string>((object[])obj, Convert.ToString); 

Vấn đề xảy ra khi tôi cố gắng cast đối tượng kiểu không rõ vào đối tượng [ ]. Tôi đã gặp lỗi khi truyền.

Một nỗ lực tôi đã thực hiện, trong đó thất bại, đã sử dụng

object[] arr = (object[])obj; 

hoặc

IEnumerable<object> list = obj as IEnumerable<object> 
object[] arr = (object[])list; 

tôi thấy đăng về kiểu giá trị và kiểu tham chiếu vấn đề về đúc.

Sẽ có một mã đơn giản có thể xử lý việc truyền tới đối tượng [] bất kể loại đối tượng, miễn là nó là một mảng? Tôi đang cố gắng tránh xử lý thủ công mọi kiểu nhập có thể có.

cảm ơn trước

+1

Bạn không thể cast mảng của kiểu giá trị đối với 'object []', chúng không tương thích. –

Trả lời

62

Bạn có thể sử dụng thực tế là mỗi mảng thực hiện IEnumerable:

string[] arr = ((IEnumerable)obj).Cast<object>() 
           .Select(x => x.ToString()) 
           .ToArray(); 

này sẽ hộp nguyên thủy một cách thích hợp, trước khi chuyển đổi chúng sang chuỗi.

Lý do các diễn viên thất bại là mặc dù mảng của tham khảo loại là hiệp biến, mảng giá trị loại không:

object[] x = new string[10]; // Fine 
object[] y = new int[10]; // Fails 

Đúc chỉ IEnumerable sẽ làm việc mặc dù. Heck, bạn có thể truyền tới Array nếu bạn muốn.

+0

Tại sao cần có hộp nguyên thủy? – Douglas

+0

@Douglas: Vì bạn không thể truyền mảng kiểu nguyên thủy đến 'object []', và chúng ta không biết kiểu trước đó. –

+0

Nó hoạt động ngay cả khi không truyền đến 'IEnumerable', tại sao bạn lại muốn truyền nó? – Tigran

10

Nếu nó luôn luôn là một bộ sưu tập của một số loại (mảng, danh sách, vv ...) sau đó cố gắng đúc trở lại đồng bằng cũ System.Collections.IEnumerable và đi từ đó

string[] str = ((System.Collections.IEnumerable)obj) 
    .Cast<object>() 
    .Select(x => x.ToString()) 
    .ToArray(); 

Đây là một thực hiện triệt để hơn để xử lý không -collections cũng

static string[] ToStringArray(object arg) { 
    var collection = arg as System.Collections.IEnumerable; 
    if (collection != null) { 
    return collection 
     .Cast<object>() 
     .Select(x => x.ToString()) 
     .ToArray(); 
    } 

    if (arg == null) { 
    return new string[] { }; 
    } 

    return new string[] { arg.ToString() }; 
} 
+0

cảm ơn, nó hoạt động tuyệt vời –

-1

ví dụ của tôi:

public class TestObject 
    { 
     public string Property1 { get; set; } 

     public string Property2 { get; set; } 

     public string Property3 { get; set; } 
    } 



    static void Main(string[] args) 
    { 
     List<TestObject> testObjectList = new List<TestObject> 
     { 
      new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }, 
      new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }, 
      new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" } 
     }; 

     List<string[]> convertedTestObjectList = testObjectList.Select(x => new string[] { x.Property1, x.Property2, x.Property3 }).ToList(); 
    } 
Các vấn đề liên quan