Как динамически новый анонимный класс? - PullRequest
88 голосов
/ 18 сентября 2010

В 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

и сцена 1:

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

Если я могу подключить метод GetType для dynamicObject, и Compel преобразует его в строго типизированный тип Приведенный выше код бесшовной может работать нормально.

Ответы [ 2 ]

68 голосов
/ 18 сентября 2010

Анонимные типы - это просто обычные типы, которые неявно объявляются.Они имеют мало общего с dynamic.

Теперь, если вам нужно использовать ExpandoObject и ссылаться на него через переменную dynamic, вы можете добавлять или удалять поля на лету.

edit

Конечно, вы можете: просто приведите его к 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

Код выше и другие можно найти, нажав на эту ссылку.

9 голосов
/ 05 января 2017

Вы можете создать ExpandoObject следующим образом:

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

И после приведения его к динамическому типу эти значения будут выглядеть как свойства:

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

Однако они не являются реальными свойствами и не могут быть доступны с помощью Reflection. Таким образом, следующее утверждение вернет ноль:

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