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

时间:2012-10-03 13:17:17

标签: c# dynamic viewbag

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

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

我有RuntimeBinderException消息属性或索引器'<> f__AnonymousType0.A'无法分配到 - 它在第2行只读。我建议这不是我想要的。也许有一些课程可以让我做类似的事情:

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

使用动态添加和设置属性。

7 个答案:

答案 0 :(得分:243)

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

答案 1 :(得分:30)

你正在寻找

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;

答案 2 :(得分:26)

我最近需要更进一步,即根据用户定义的条目,在动态对象中添加属性,动态自动。此处的示例和Microsoft's ExpandoObject documentation中的示例并未专门针对动态添加属性,但可以通过枚举和删除属性的方式进行推测。无论如何,我认为这可能对某人有所帮助。以下是如何向ExpandoObject添加真正动态属性的极其简化版本(忽略关键字和其他处理):

{{1}}

答案 3 :(得分:10)

您可以使用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

答案 4 :(得分:7)

dynamic MyDynamic = new ExpandoObject();

答案 5 :(得分:4)

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

答案 6 :(得分:1)

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

或存在值

  var data = new { studentId, StudentName };