2012-10-03 35 views
85

Ở đó, ví dụ: ViewBag thuộc tính của lớp ControllerBase và chúng tôi có thể nhận/đặt giá trị động và thêm bất kỳ số trường hoặc thuộc tính bổ sung nào cho đối tượng này, điều này thật tuyệt. Tôi muốn sử dụng một cái gì đó tương tự, ngoài ứng dụng MVC và Controller lớp trong các loại ứng dụng khác. Khi tôi cố gắng tạo dynamic đối tượng và thiết lập nó là tài sản như dưới đây:Làm cách nào để tạo loại động hoặc đối tượng động trong C#?

1. dynamic MyDynamic = new { A="a" }; 
2. MyDynamic.A = "asd"; 
3. Console.WriteLine(MyDynamic.A); 

Tôi đã có RuntimeBinderException với thông điệp tài sản hoặc indexer '<> f__AnonymousType0.A' không thể giao cho - đó là chỉ đọc trong dòng 2. Ngoài ra tôi đề nghị Nó không phải là khá những gì tôi đang tìm kiếm. Có thể có một số lớp học có thể cho phép tôi làm điều gì đó như:

??? MyDynamic = new ???(); 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = DateTime.Now; 
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42; 

với tính năng thêm và cài đặt động.

Trả lời

181
dynamic MyDynamic = new System.Dynamic.ExpandoObject(); 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = "C"; 
MyDynamic.Number = 12; 
MyDynamic.MyMethod = new Func<int>(() => 
{ 
    return 55; 
}); 
Console.WriteLine(MyDynamic.MyMethod()); 

Đọc về nhiều ExpandoObject class và cho mẫu hơn: Đại diện cho một đối tượng mà các thành viên có thể được thêm tự động và loại bỏ tại thời gian chạy.

+2

Hãy bỏ phiếu cho tính năng này trong Visual Studio [UserVoice] (https: //visualstudio.uservoice. com/forums/121579-visual-studio/đề xuất/7062098-hỗ trợ-đối tượng-initializers-on-expandoobjects). – orad

28

ExpandoObject là những gì bạn đang tìm kiếm.

dynamic MyDynamic = new ExpandoObject(); // note, the type MUST be dynamic to use dynamic invoking. 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = "C"; 
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42; 
7
dynamic MyDynamic = new ExpandoObject(); 
9

Bạn có thể sử dụng ExpandoObject Class trong không gian tên System.Dynamic.

dynamic MyDynamic = new ExpandoObject(); 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = "C"; 
MyDynamic.SomeProperty = SomeValue 
MyDynamic.number = 10; 
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; }); 

More Info có thể được tìm thấy tại ExpandoObject MSDN

15

tôi thời gian gần đây đã có một nhu cầu để có một bước xa hơn, đó là làm cho những bổ sung tài sản trong đối tượng năng động, năng động bản thân, dựa trên người dùng định nghĩa mục. Các ví dụ ở đây và từ Microsoft's ExpandoObject documentation, không đặc biệt giải quyết thêm thuộc tính động, nhưng, có thể được phỏng đoán từ cách bạn liệt kê và xóa thuộc tính. Nhưng dù sao, tôi nghĩ điều này có thể hữu ích cho ai đó. Dưới đây là một phiên bản cực kỳ đơn giản làm thế nào để thêm các thuộc tính thực sự năng động để một ExpandoObject (bỏ qua từ khóa và xử lý khác):

 // my pretend dataset 
     List<string> fields = new List<string>(); 
     // my 'columns' 
     fields.Add("this_thing"); 
     fields.Add("that_thing"); 
     fields.Add("the_other"); 

     dynamic exo = new System.Dynamic.ExpandoObject(); 

     foreach (string field in fields) 
     { 
      ((IDictionary<String, Object>)exo).Add(field, field + "_data"); 
     } 

     // output - from Json.Net NuGet package 
     textBox1.Text = Newtonsoft.Json.JsonConvert.SerializeObject(exo); 
Các vấn đề liên quan