174

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

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

我有RuntimeBinderException消息Property or indexer '<>f__AnonymousType0.A' cannot be assigned to - 它在第 2 行只读。另外我建议这不是我要找的。也许有一些课程可以让我做类似的事情:

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

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

4

7 回答 7

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

于 2012-10-03T13:21:31.423 回答
42

我最近需要更进一步,即根据用户定义的条目在动态对象中添加属性,使其自身动态化。此处的示例以及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);
于 2016-08-29T14:58:04.510 回答
34

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;
于 2012-10-03T13:21:20.440 回答
30
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};
于 2019-10-17T15:19:05.597 回答
16
 var data = new { studentId = 1, StudentName = "abc" };  

或存在价值

  var data = new { studentId, StudentName };
于 2019-11-19T12:42:38.963 回答
15

您可以使用命名空间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找到

于 2012-10-03T13:55:52.210 回答
7
dynamic MyDynamic = new ExpandoObject();
于 2012-10-03T13:23:17.930 回答