C # ile kendi dinamik türü veya dinamik nesnesi nasıl oluşturulur?


130

Örneğin, sınıfın ViewBag özelliği var ControllerBaseve dinamik olarak değerleri alabilir / ayarlayabilir ve bu nesneye herhangi bir sayıda ek alan veya özellik ekleyebiliriz, ki bu harika. MVC uygulamasının ve Controllerdiğer sınıfların ötesinde böyle bir şey kullanmak istiyorum. uygulama türleri. Dinamik nesne oluşturmaya ve özelliğini aşağıdaki gibi ayarlamaya çalıştığımda:

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

Elimdeki RuntimeBinderExceptionmesajı ile Varlığı veya dizinleyicideki '<> f__AnonymousType0.A' olarak atanamaz - bu salt okunur Ayrıca ben Ben görünümlü için çalışıyorum oldukça bu değil önermek hattı 2.. Belki şöyle bir şey yapmama izin verecek bir sınıf var:

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

dinamik ekleme ve ayar özellikleri ile.

Yanıtlar:


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());

ExpandoObject sınıfı ve daha fazla örnek hakkında daha fazla bilgi edinin : Üyeleri çalışma zamanında dinamik olarak eklenebilen ve kaldırılabilen bir nesneyi temsil eder.


3
Lütfen Visual Studio UserVoice'ta bu özelliğe oy verin .
orad

33

Son zamanlarda bunu bir adım daha ileri götürme ihtiyacım vardı, bu da dinamik nesnede özellik eklemelerini kullanıcı tanımlı girişlere göre dinamik, dinamik hale getirmekti. Buradaki örnekler ve Microsoft'un ExpandoObject belgelerinden , özellikle dinamik olarak özellik eklemeyi ele almamaktadır, ancak özellikleri nasıl numaralandırdığınız ve sildiğinizden anlaşılabilir. Her neyse, bunun birine yardımcı olabileceğini düşündüm. İşte bir ExpandoObject'e gerçekten dinamik özelliklerin nasıl ekleneceğinin son derece basitleştirilmiş bir versiyonu (anahtar kelime ve diğer işlemleri göz ardı ederek):

        // 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 aradığınız şey.

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

Ad alanında ExpandoObject Classolanı kullanabilirsiniz 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++; });

Daha fazla bilgi ExpandoObject MSDN'de bulunabilir


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


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

Ya da değer mevcut

  var data = new { studentId, StudentName };
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.