2011-06-22 86 views
20

Sử dụng phản chiếu Tôi có một đối tượng mà tôi cần đưa vào danh sách các mục có thể lặp lại (loại không xác định, sẽ là đối tượng). Sử dụng cửa sổ Watch tôi có thể thấy đối tượng của tôi là một mảng của một số loại vì nó cho tôi biết số lượng các phần tử và tôi có thể phát nổ chế độ xem dạng cây để tự xem các phần tử.Đối tượng C# thành mảng

Thứ nhất, tôi cần kiểm tra xem đối tượng đã truyền là một loại mảng nào đó (có thể là Danh sách, có thể là đối tượng [], v.v.). Sau đó, tôi cần phải lặp qua mảng đó. Tuy nhiên, tôi không thể thực hiện chuyển đổi loại.

Đây là cách tôi đang sử dụng nó (viết tắt):

private static void Example(object instance, PropertyInfo propInfo) 
    { 
     object anArray = propInfo.GetValue(instance, null); 
     ArrayList myList = anArray as ArrayList; 
     foreach (object element in myList) 
     { 
      // etc 
     } 
    } 

tôi đã cố gắng dàn diễn viên khác nhau. Ở trên không tăng ngoại lệ nhưng danh sách của tôi là null khi anArray thực sự tồn tại và chứa các mục. Ví dụ thực tế được lưu là Danh sách <> được nhập mạnh mẽ nhưng có thể mất một tập hợp con các biểu mẫu có giới hạn nếu cần. Nhưng điểm của bài tập là phương thức Example() này không biết kiểu cơ bản của thuộc tính.

+0

bạn có thể tìm hiểu các loại đối tưởng khỏi instance.GetType() và bạn có thể so sánh nó với loại desirebale sử dụng 'is', ví dụ 'if (instance.GetType() là IEnumerable)' – Tsar

+1

@Bad Display Name bây giờ là cách hoạt động của từ khóa * là *, những gì bạn đang làm đang cố gắng truyền từ System.Type sang System.Collection.IEnumerable, mà không 't làm việc kể từ khi System.Type không thực hiện giao diện đó. có lẽ bạn có nghĩa là ** typeof (IEnumerable) .IsAssignableFrom (instance.GetType()) ** – MattDavey

Trả lời

41

Đúc nó đến một ArrayList chỉ là đi làm việc nếu đối tượng thực sự một ArrayList. Nó sẽ không làm việc với một System.Array, hoặc một System.Collections.Generic.List`1 ví dụ.

Tôi nghĩ rằng những gì bạn thực sự cần làm là bỏ nó vào IEnumerable, vì đó là yêu cầu duy nhất của bạn để lặp qua nó ...

object anArray = propInfo.GetValue(instance, null); 
IEnumerable enumerable = anArray as IEnumerable; 
if (enumerable != null) 
{ 
    foreach(object element in enumerable) 
    { 
     // etc... 
    } 
} 
+0

Wow, làm việc nhanh và hoạt động! Cảm ơn. – GeoffM

+1

Cũng nhờ những người khác. – GeoffM

14

Cố gắng truyền tới IEnumerable. Đây là giao diện cơ bản nhất tất cả các bảng liệt kê, mảng, danh sách, v.v.

IEnumerable myList = anArray as IEnumerable; 
if (myList != null) 
{ 
    foreach (object element in myList) 
    { 
     // ... do something 
    } 
} 
else 
{ 
    // it's not an array, list, ... 
} 
1

Hãy thử điều này:

var myList = anArray as IEnumerable; 
    if (mylist != null) 
    { 
     foreach (var element in myList) 
     { 
      // etc 
     } 
    } 

Bạn cũng có thể cần phải xác định loại chung của IEnumerable, tùy thuộc vào tình huống của bạn.

1

Bạn có thể truyền tới IEnumerable nếu đó là tập hợp bất kỳ loại nào (mảng, danh sách, v.v.). Ngoài ra PropertyInfo chứa thuộc tính PropertyType mà bạn có thể sử dụng để tìm hiểu loại thực tế nếu bạn muốn.

1

Đơn giản chỉ cần cố gắng này

string[] arr = ((IEnumerable)yourOjbect).Cast<object>() 
          .Select(x => x.ToString()) 
          .ToArray(); 
Các vấn đề liên quan