在C#3.0中,您可以使用以下语法创建匿名类
var o1 = new { Id = 1, Name = "Foo" };
有没有办法动态地创建这些匿名类到变量?
例:
var o1 = new { Id = 1, Name = "Foo" };
var o2 = new { SQ = 2, Birth = DateTime.Now };
动态创建示例:
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
如果我可以挂钩dynamicObject的GetType方法,并且Compel转换为强类型的Type。上面的无缝代码可以正常工作。
匿名类型只是隐式声明的常规类型。他们与dynamic
没什么关系。
现在,如果您使用ExpandoObject并通过dynamic
变量引用它,您可以动态添加或删除字段。
编辑
当然你可以:把它投到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
点击该链接可以找到上面的代码和更多代码。
您可以像这样创建一个ExpandoObject:
IDictionary<string,object> expando = new ExpandoObject();
expando["Name"] = value;
在将其转换为动态后,这些值将看起来像属性:
dynamic d = expando;
Console.WriteLine(d.Name);
但是,它们不是实际属性,无法使用Reflection访问。所以以下语句将返回null:
d.GetType().GetProperty("Name")