c# – 如何动态新的匿名类?

在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));

Beacuse我需要做:

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。
上面的无缝代码可以正常工作。

匿名类型只是隐式声明的常规类型。他们与动态没有什么关系。

现在,如果您使用ExpandoObject并通过动态变量引用它,您可以在运行中添加或删除字段。

编辑

当然你可以:只是把它转换为IDictionary< string,object&gt ;.然后可以使用索引器。 您使用相同的投射技术对字段进行迭代:

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

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

http://stackoverflow.com/questions/3740021/how-to-dynamic-new-anonymous-class

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 如何动态新的匿名类?