2011-10-19 28 views
5
dynamic model = new ExpandoObject(); 
model.Data = "asdf"; 

List<dynamic> listOfx = new List<dynamic>(); 
for (int i = 0; i < 3; i++) { 
    dynamic x = new ExpandoObject(); 
    x.ID = i; 
    x.Name = "test" + i.ToString(); 
    listOfx.Add(x); 
} 
model.listOfx = listOfx; 

Khi tôi chạy điều này, tôi có thể xem Dữ liệu bên trong mô hình, nhưng không phải listOfx.Danh sách bên trong ExpandoObject

vấn đề: làm thế nào để có được một danh sách (hoặc IEnumerable) bên trong một ExpandoObject

UPDATE trên Giải pháp: enter image description here

Bởi vì tôi không thể nhìn thấy lifOfx trong cửa sổ người dân địa phương tôi nghĩ rằng nó là không đang làm việc. Ở đây (qua y) bạn có thể thấy nó. :-)

Trả lời

3

tôi không thể tái tạo các vấn đề tương tự trên Mono 2.10:

using System.Dynamic; 
using System.Collections.Generic; 

using System; 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     dynamic x = new ExpandoObject(); 
     x.Data ="test"; 
     x.Arr = new [] { "test1","test2"}; 
     x.Lst = new List<string> { "aap", "noot", "mies" }; 

     Console.WriteLine(string.Join(", ", x.Arr)); 
     Console.WriteLine(string.Join(", ", x.Lst)); 
    } 
} 

Output:

/tmp @ dmcs test.cs && mono test.exe 
test1, test2 
aap, noot, mies 

Tôi sẽ kiểm tra lại trên cửa sổ thời gian ngắn.

Cập nhật đã thử nghiệm như sau:

  • linux-biên dịch (DMCs) chạy nhị phân trên Windows với Mono 2.10: OK
  • linux-biên dịch (DMCs) chạy nhị phân trên Windows với MS NET 4.0: OK
  • các cửa sổ biên soạn (DMCs) chạy nhị phân trên Windows với Mono 2.10: OK
  • các cửa sổ biên soạn (DMCs) chạy nhị phân trên Windows với MS.NET 4.0: OK
  • cửa sổ biên soạn (csc.exe) chạy nhị phân trên Windows với Mono 2.10: OK
  • các cửa sổ biên soạn (csc.exe) chạy nhị phân trên Windows với MS.NET 4.0: OK

Trên Linux Tôi đã chỉ thử nghiệm các nhị phân được biên dịch bởi mono chính nó, nhưng tôi không lường trước bất kỳ vấn đề. Có lẽ có điều gì đó khác biệt một cách tinh tế về việc lưu trữ động lực bên trong Danh sách <>, tôi sẽ kiểm tra rằng bây giờ

+0

Rất cám ơn @sehe - thực ra đó là lỗi của riêng tôi ... nghĩ rằng nó không hoạt động do không thể nhìn thấy trong cửa sổ địa phương. Nhưng nó là! –

+0

@DaveMateer Ok, thx cho chúng tôi biết – sehe

0

ExpandoObject hỗ trợ IDictionary. Bạn có thể truyền nó như

IDictionary myModel =(IDictionary)Model; 

Vì vậy, bạn có thể lặp lại nó.

4

Mã bạn có ở trên hoạt động hoàn hảo để thiết lập danh sách. Ví dụ, thêm này sau khi mã của bạn sẽ hoạt động tốt:

// Access value inside list 
Console.WriteLine(model.listOfx[1].Name); 

// Iterate through list 
foreach (var o in model.listOfx) 
{ 
    Console.WriteLine(o.ID); 
} 

Ví dụ, hãy thử như sau (ví dụ đầy đủ chức năng):

using System; 
using System.Collections.Generic; 
using System.Dynamic; 
using System.Linq; 

public static class Test 
{ 

    public static void Main() 
    { 
     dynamic model = new ExpandoObject(); 
     model.Data = "asdf"; 

     List<dynamic> listOfx = new List<dynamic>(); 
     for (int i = 0; i < 3; i++) 
     { 
      dynamic x = new ExpandoObject(); 
      x.ID = i; 
      x.Name = "test" + i.ToString(); 
      listOfx.Add(x); 
     } 
     model.listOfx = listOfx; 

     // Access value inside list 
     Console.WriteLine(model.listOfx[1].Name); 

     // Iterate through list 
     foreach (var o in model.listOfx) 
     { 
      Console.WriteLine(o.ID); 
     } 

     Console.ReadKey(); 
    } 
} 

này sử dụng chính xác mẫu mã của bạn.

+0

Tôi nghĩ bạn có nghĩa là 'foreach (var o trong model.listOfx)' (hai lần)? – sehe

+0

@sehe Đã sửa lỗi. Cảm ơn. –

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