2012-01-25 24 views
8

Trong một phương pháp, tôi nhận được object.Làm thế nào để nhận được các khoản mục từ một IList <> nhận như một đối tượng?

Trong một số trường hợp, điều này object có thể là một IList của "điều gì đó" (Tôi không kiểm soát được điều này "một cái gì đó").

Tôi cố gắng để:

  1. Xác định rằng đối tượng này là một IList (của một cái gì đó)
  2. Cast object thành một "IList<something>" để có thể nhận được Count từ nó.

Hiện tại, tôi bị kẹt và tìm ý tưởng.

+0

Là 'Đếm' * tất cả * bạn muốn? Nếu vậy, bạn không cần nó là một 'IList ', một 'IEnumerable' đơn giản sẽ làm. – AakashM

+0

Có, 'Đếm' là tất cả những gì tôi muốn. Tuy nhiên, tôi không thể nhìn thấy bất kỳ 'Count' trong' IEnumerable'? – remio

Trả lời

17

Bạn có thể kiểm tra xem object có thực hiện IList sử dụng is hay không.

Sau đó, bạn có thể truyền object đến IList để nhận số lượng.

object myObject = new List<string>(); 

// check if myObject implements IList 
if (myObject is IList) 
{ 
    int listCount = ((IList)myObject).Count; 
} 
+0

Ah, tuyệt, đây là những gì tôi đã bỏ lỡ. Tôi đang tìm kiếm 'IList 'là một' IList'. Nhưng như 'Danh sách ' và 'Bộ sưu tập ' là 'IList' s, Điều này là đủ cho tôi. Cảm ơn. – remio

4
if (obj is ICollection) 
{ 
    var count = ((ICollection)obj).Count; 
} 
+0

Cảm ơn câu trả lời của bạn. Có lợi ích gì khi đưa vào 'ICollection' qua việc đúc thành' IList' không? – remio

+1

Sẽ hoạt động với nhiều loại bộ sưu tập hơn, truyền tới IEnumerable và đọc .Count() thay vì .Count sẽ làm việc với nhiều hơn nữa. –

+1

@DannyVarod nhưng 'IEnumerable.Count()' rủi ro liệt kê bộ sưu tập để đếm các mục của nó. – phoog

1
 object o = new int[] { 1, 2, 3 }; 

     //... 

     if (o is IList) 
     { 
      IList l = o as IList; 
      Console.WriteLine(l.Count); 
     } 

này in 3, vì int [] là một IList.

0

Vì tất cả những gì bạn muốn là số lượng, bạn có thể sử dụng thực tế là bất cứ điều gì thực hiện IList<T> cũng thực hiện IEnumerable; và hơn nữa, có một phương pháp khuyến nông trong System.Linq.Enumerable trả về số lượng của bất kỳ chuỗi (generic):

var ienumerable = inputObject as IEnumerable; 
if (ienumerable != null) 
{ 
    var count = ienumerable.Cast<object>().Count(); 
} 

Các cuộc gọi đến Cast là vì out of the box there isn't a Count on non-generic IEnumerable.

+0

Ah, vâng, tôi hiểu rồi! Nhưng tôi có phải mong đợi các tác động về hiệu suất với việc thực hiện này không? – remio

+0

@remio có, bạn sẽ. Vì bạn đang gọi 'Cast ', bạn sẽ không thể hưởng lợi từ thuộc tính' Count' của danh sách cơ bản, vì vậy bạn sẽ thực sự lặp lại toàn bộ danh sách để đếm các mục. Hơn nữa, nếu các phần tử của danh sách là một kiểu giá trị, bạn sẽ phải đóng từng phần tử của chúng bởi vì các thành phần được đưa vào 'đối tượng'. – phoog

Các vấn đề liên quan