2011-07-25 32 views
7

tôi đang tạo ra một điều khiển mà nhận được trong nguồn dữ liệu một DataSet hoặc Danh sáchChuyển đổi IEnumerable trong Danh sách <T>

Làm thế nào tôi chuyển đổi một IEnumerable vào danh sách trong một sự kiện CreateChildControls?

protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding) 
{ 
    if (dataSource is System.Data.DataSet) 
    { 
    } 
    else if(dataSource is IList) 
    { 
    } 
} 

Trả lời

12

Thông thường người ta sẽ sử dụng IEnumerable<T>.ToList() extensionmethod từ LINQ nhưng trong trường hợp của bạn, bạn không thể sử dụng nó (ngay lập tức) bởi vì bạn có phi generic IEnumerable giao diện. Sou bạn sẽ phải bỏ nó trước (cũng bằng cách sử dụng Linq):

datasource.Cast<object>().ToList(); 

Bất kể bạn thực sự thu thập ban đầu, điều này sẽ luôn thành công.

+0

cảm ơn, cách tôi có thể lấy kiểu gốc và không đặt loại đối tượng ? – Pablogrind

+0

Trong trường hợp kiểu đó luôn giống nhau, nó đơn giản như 'datasource.Cast (). ToList();' Trong trường hợp nó không có, bạn có vấn đề về thiết kế. Một giải pháp là cung cấp tất cả các loại mục trong bộ sưu tập của bạn một giao diện chung chứa tất cả các thành viên bạn cần trong phương thức người tiêu dùng 'CreateChildControls()', ví dụ: 'datasource.Cast () .ToList();' – bitbonk

+0

@bitbonk: Nếu mã của bạn nằm trong 'datasource is IList' thì nó sẽ là một danh sách. Không cần tạo danh sách, bạn chỉ có thể truyền tới danh sách. Sau đó, vấn đề 'định dạng ban đầu' không phải là vấn đề –

6

Tôi đọc lại câu hỏi của bạn và có vẻ như bạn đang nhận tập dữ liệu ALREADY danh sách HOẶC một Số liệu, nhưng nó được truyền tới IEnumerable. Trong trường hợp này, chỉ cần làm

IList myList = (IList)datasource //will throw exception if invalid 

hoặc

IList myList = datasource as IList //mylist will be null if conversion cannot be made 
+0

'dataSource.ToList()' sẽ không hoạt động vì dataSource không thuộc loại IEnumerable bitbonk

+0

Điều này đúng, tôi đã chỉnh sửa nó để phản ánh như vậy. Không cần phải tạo danh sách mới vì nếu 'x là y' thử nghiệm suceeeds thì đơn giản (y) x sẽ yeild kết quả của bạn với ít chi phí xử lý –

0

Để trả lời câu hỏi của bạn 'cách tôi có thể lấy Loại gốc và không đặt loại đối tượng?'.

Mọi loại trong khuôn khổ .NET chứa phương thức GetType để tìm nạp loại đối tượng được chỉ định. Bạn có thể sử dụng nó trước phương pháp ToList.

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