如何在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();