2011-01-26 15 views
7

Im cố gắng sử dụng DynamicObject trong C#, và tôi cần một loạt các động:Mảng năng động | ExpandoObject | với một cú pháp initialize nén

var d = new dynamic[]; 

mà hoạt động tốt.

CHỈNH SỬA: Xem ExpandoObject bên dưới.

Nhưng tôi cũng muốn để điền vào đó mảng với một số dữ liệu với nén khởi cú pháp mới này:

var d = new dynamic[] { 
    new { 
    Name = "Some", 
    Number = 1010 
    }, 
    new { 
    Name = "Other", 
    Number = 2010 
    } 
} 

Nhưng trong trường hợp đó tất cả các đối tượng được loại không động "đối tượng" và một vòng qua các mục sẽ cho tôi một ngoại lệ:

foreach (dynamic item in d) 
{ 
    @item.Name 
    @item.Number 
} 

Lỗi: 'đối tượng' không chứa định nghĩa cho 'Tên'. Tôi đoán tôi chỉ cần khởi tạo các mục mảng một cách sai lầm. Làm cách nào để thêm đối tượng động thay thế?

EDIT: Nội dung mới:

Tôi nhận ra "năng động" không có khả năng để tự động thêm thuộc tính.

Tôi nên sử dụng ExpandoObject để hiển thị tất cả các mục trong từ điển nội bộ dưới dạng thuộc tính. Nhưng tiếc là ExpandoObject dường như không hỗ trợ đẹp này nén tạo cú pháp, và trình biên dịch phàn nàn:

var d = new ExpandoObject[]{ 
new ExpandoObject(){ 
    Name="Nnn", 
    Number=1080 
    } 
} 

Vì vậy, câu trả lời chỉ có thể là: nó là không thể.

+4

Bạn có chắc chắn bạn không chỉ muốn một mảng của một loại vô danh? – Ani

+1

Đây có phải là trong ASP.NET MVC3? –

+1

Hãy nhớ rằng một 'năng động' _is_ một' đối tượng', chỉ là trình biên dịch C# xử lý nó một cách khác nhau và trang trại tất cả các truy cập trên 'động' off để DLR – thecoop

Trả lời

4

tôi đến hơi muộn nhưng đây là những gì tôi tìm thấy về nó:

nếu tôi không thể khởi tạo một ExpandoObject, làm thế nào về initialising nó với một loại động?

vì vậy tôi đã làm phương pháp mở rộng sau

public static ExpandoObject CreateExpando(this object item) 
    { 

     var dictionary = new ExpandoObject() as IDictionary<string, object>; 
     foreach (var propertyInfo in item.GetType().GetProperties()) 
     { 
      dictionary.Add(propertyInfo.Name, propertyInfo.GetValue(item, null)); 
     } 
     return (ExpandoObject)dictionary; 
    } 

Tôi biết đó là xa lý tưởng, nhưng đó là tốt nhất tôi có thể đạt được cho bây giờ, nó hoạt động như thế này:

var myExpandoObject = new { Name="Alex", Age=30}.CreateExpando(); 
+0

Cảm ơn Alex, ý tưởng hay. – joeriks

+0

Tôi có thể sử dụng phương pháp mở rộng này nếu phép chiếu của tôi được lưu trữ trong một chức năng không? ví dụ: 'someQueryable.Select (ReusableProjection(). ToExpando())', trong đó 'ReusableProjection' trả về giá trị này:' Expression > ' – sports

6

Hy vọng rằng bạn không thực sự cần động lực

class Program 
{ 
    static void Main(string[] args) 
    { 
     var d = new[] 
        { 
         new 
          { 
           Name = "Some", 
           Number = 1010 
          }, 
         new 
          { 
           Name = "Other", 
           Number = 2010 
          } 
        }; 
     foreach (var item in d) 
     { 
      string s = @item.Name; 
      int n = @item.Number; 
      Console.WriteLine("{0} {1}", s, n); 
     } 
    } 
} 
+0

Vâng, vì vậy tôi nghĩ, và tôi đã thử điều đó quá - nhưng điều đó mang lại cho tôi cùng một lỗi. Hmm ... – joeriks

+0

@joeriks - đã thêm toàn bộ đoạn mã mà tôi đã khởi chạy, tôi không có bất kỳ lỗi nào. – Snowbear

+0

@joeriks - nếu nó liên quan đến ASP.Net MVC thì có lẽ bạn nên gắn thẻ câu hỏi cho phù hợp. Tôi không chắc làm thế nào câu trả lời của tôi tương quan với hành vi Razor. – Snowbear

1

Khung nguồn mở Impromptu-Interfacecompressed initialization syntax làm việc với ExpandoObject.

dynamic @new = Builder.New<ExpandoObject>(); 

var d = @new.List( 
    @new.Expando(
    Name:"Some", 
    Number: 1010 
), 
    @new.Expando(
    Name:"Other", 
    Number: 2010 
) 
); 
+0

Tuyệt, tôi sẽ cung cấp cho Impromptu một cái nhìn. – joeriks