Làm cách nào để tạo kiểu động hoặc đối tượng động trong C #?


130

Ví dụ, có thuộc tính ViewBag của ControllerBaselớp và chúng ta có thể tự động nhận / đặt giá trị và thêm bất kỳ số lượng trường hoặc thuộc tính bổ sung nào vào đố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à Controllerlớp khác các loại ứng dụng. Khi tôi cố gắng tạo đối tượng động và đặt thuộc tính như bên dưới:

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

Tôi đã nhận được RuntimeBinderExceptionthông báo Thuộc tính hoặc bộ chỉ mục '<> f__AnonymousType0.A' - nó chỉ được đọc trong dòng 2. Ngoài ra tôi đề nghị Nó không hoàn toàn là những gì tôi đang tìm kiếm. Có lẽ có một số lớp có thể cho phép tôi làm một cái gì đó như:

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

với các thuộc tính bổ sung và thiết lập động.

Câu trả lời:


279
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 thêm về lớp ExpandoObject và để biết thêm các mẫu: Đại diện cho một đối tượng có các thành viên có thể được thêm và xóa động khi chạy.


3
Vui lòng bỏ phiếu cho tính năng này trong Visual Studio UserVoice .
orad

33

Gần đây tôi đã cần phải tiến thêm một bước này, đó là thực hiện các bổ sung thuộc tính trong đối tượng động, tự động, dựa trên các mục nhập do người dùng xác định. Các ví dụ ở đây và từ tài liệu ExpandoObject của Microsoft , không đề cập cụ thể đến việc thêm các thuộc tính một cách linh hoạt, nhưng, có thể được phỏng đoán từ cách bạn liệt kê và xóa các thuộc tính. Nhưng dù sao, tôi nghĩ rằng điều này có thể hữu ích cho ai đó. Đây là một phiên bản cực kỳ đơn giản về cách thêm các thuộc tính động thực sự vào 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);

32

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;

11

Bạn có thể sử dụng ExpandoObject Classđó là trong System.Dynamickhông gian tên.

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

Thông tin thêm có thể được tìm thấy tại ExpandoObject MSDN


9
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};


7
 var data = new { studentId = 1, StudentName = "abc" };  

Hoặc giá trị là hiện tại

  var data = new { studentId, StudentName };
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.