如何dynamic新的匿名类?

在C#3.0中,您可以使用以下语法创build匿名类

var o1 = new { Id = 1, Name = "Foo" }; 

有没有办法dynamic创build这些匿名类到variables?


例:

 var o1 = new { Id = 1, Name = "Foo" }; var o2 = new { SQ = 2, Birth = DateTime.Now }; 

dynamic创build示例:

 var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo")); var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth", DateTime.Now)); 

因为我需要这样做:

 dynamic o1 = new ExpandObject(); o1."ID" = 1; <--"ID" is dynamic name o1."Name" = "Foo"; <--"Name" is dynamic name 

和Scene1:

 void ShowPropertiesValue(object o) { Type oType = o.GetType(); foreach(var pi in oType.GetProperties()) { Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null)); } } 

如果我打电话:

 dynamic o1 = new ExpandObject(); o1.Name = "123"; ShowPropertiesValue(o1); 

它不能显示结果:

 Name = 123 

另外我如何将ExpandoObject转换为AnonymouseType?

 Type type = o1.GetType(); type.GetProperties(); <--I hope it can get all property of o1 

最后,我修改ShowPropertiesValue()方法

 void ShowPropertiesValue(object o) { if( o is static object ) <--How to check it is dynamic or static object? { Type oType = o.GetType(); foreach(var pi in oType.GetProperties()) { Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null)); } } else if( o is dynamic object ) <--How to check it is dynamic or static object? { foreach(var pi in ??? ) <--How to get common dynamic object's properties info ? { Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null)); } } } 

如何实现DynamicNewAnonymous方法或如何修改ShowPropertiesValue()?

我的动机是:

 dynamic o1 = new MyDynamic(); o1.Name = "abc"; Type o1Type = o1.GetType(); var props = o1Type.GetProperties(); <--I hope can get the Name Property 

如果我可以钩dynamic对象的GetType方法,并将Compel转换为强types的types。 上面的无缝代码可以正常工作。

匿名types只是隐式声明的常规types。 他们与dynamic无关。

现在,如果您要使用ExpandoObject并通过dynamicvariables引用它,则可以随时添加或删除字段。

编辑

当然你可以:只要将它转换为IDictionary<string, object> 。 那么你可以使用索引器。

您使用相同的铸造技术遍历字段:

 dynamic employee = new ExpandoObject(); employee.Name = "John Smith"; employee.Age = 33; foreach (var property in (IDictionary<string, object>)employee) { Console.WriteLine(property.Key + ": " + property.Value); } // This code example produces the following output: // Name: John Smith // Age: 33 

上面的代码和更多可以通过点击该链接find。

你可以像这样创build一个ExpandoObject:

 IDictionary<string,object> expando = new ExpandoObject(); eo["Name"] = value; 

在将其转换为dynamic后,这些值可能看起来像属性:

 dynamic d = expando ; Console.WriteLine(d.Name); 

但是它们不是实际的属性,不能用Reflection来访问。 所以下面的说法是正确的:

 d.GetType().GetProperty("Name") == null