如何在C#中创build自己的dynamictypes或dynamic对象?

在那里,例如, ControllerBase类的ViewBag属性,我们可以dynamic地获取/设置值,并添加任何数量的附加字段或属性到这个对象,这是很酷的。我想使用类似的东西,超越MVC应用程序和Controller类在其他types的应用程序。 当我尝试创builddynamic对象并设置它的属性如下所示:

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

我有RuntimeBinderException与消息属性或索引器'<> f__AnonymousType0.A'不能被分配给 – 它是只读在第2行。我也build议这不是我所期待的。 也许有一些课程可以让我做这样的事情:

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

dynamic添加和设置属性。

 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类和更多示例:表示可以在运行时dynamic添加和删除其成员的对象。

ExpandoObject是你在找什么。

 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; 

我最近需要更进一步,这是为了使dynamic对象中的属性增加,根据用户定义的条目dynamic地进行。 这里的示例以及来自Microsoft的ExpandoObject文档的示例并不是专门针对dynamic添加属性的,但可以从枚举和删除属性的方式来推测。 无论如何,我认为这可能对某人有帮助。 下面是一个极其简化的如何向ExpandoObject添加真正的dynamic属性(忽略关键字和其他处理)的版本:

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

您可以使用System.Dynamic命名空间中的ExpandoObject Class

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

更多信息可以在ExpandoObject MSDNfind

 dynamic MyDynamic = new ExpandoObject();