如何在C#中创建自己的动态类型或动态对象?


130

例如,那里ControllerBaseclass的ViewBag属性,我们可以动态获取/设置值并向此对象添加任意数量的其他字段或属性,这很酷。我想使用类似的东西,除了MVC应用程序和Controller其他类中的类应用程序类型。当我尝试创建动态对象并设置其属性时,如下所示:

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

我收到了RuntimeBinderException消息Property或indexer'<> f__AnonymousType0.A'不能分配给它的信息-只能在第2行中读取。另外,我建议它也不是我要找的东西。也许有一些课程可以让我做类似的事情:

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

具有动态添加和设置属性。

Answers:


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


3
请在Visual Studio UserVoice中对该功能进行投票。
orad 2015年

33

我最近需要进一步迈出这一步,那就是基于用户定义的条目在动态对象(动态本身)中添加属性。此处的示例以及Microsoft的ExpandoObject文档中的示例均未专门解决动态添加属性的问题,但是可以通过枚举和删除属性来推测这些示例。无论如何,我认为这可能对某人有所帮助。这是如何向ExpandoObject添加真正的动态属性(忽略关键字和其他处理)的极其简化的版本:

        // 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 你在找什么

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

您可以使用名称空间中的ExpandoObject Class哪个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++; });

可以在ExpandoObject MSDN中找到更多信息。




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

或存在价值

  var data = new { studentId, StudentName };
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.