type functions c# c#-3.0 anonymous-types dynamic-programming

c# - functions - ¿Cómo nueva clase anónima dinámica?



instance dynamic object c# (2)

En C # 3.0 puedes crear clases anónimas con la siguiente sintaxis

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

¿Hay alguna manera de crear dinámicamente estas clases anónimas a una variable?

Ejemplo:

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

Ejemplo de creación dinámica:

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

Porque necesito hacerlo:

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

Y 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)); } }

si llamo:

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

No puede mostrar el resultado:

Name = 123

¿Y también cómo convertir el ExpandoObject a AnonymouseType?

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

Por último, modifico el método 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)); } } }

¿Cómo implementar el método DynamicNewAnonymous o cómo modificar ShowPropertiesValue ()?

Mis motivaciones son:

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

Si puedo enganchar el método GetType de dynamicObject, y Compel se convierte en Type fuertemente tipado. El código Seamless de arriba puede funcionar bien.


Los tipos anónimos son solo tipos regulares que se declaran implícitamente. Tienen poco que ver con la dynamic .

Ahora, si usara un ExpandoObject y lo referenciara a través de una variable dynamic , podría agregar o eliminar campos sobre la marcha.

editar

Claro que puedes: simplemente IDictionary<string, object> a IDictionary<string, object> . Entonces puedes usar el indexador.

Utiliza la misma técnica de lanzamiento para recorrer los campos:

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

El código anterior y más se pueden encontrar haciendo clic en ese enlace.


Puedes crear un ExpandoObject así:

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

Y después de convertirlo a dinámico, esos valores se verán como propiedades:

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

Sin embargo, no son propiedades reales y no se puede acceder utilizando Reflection. Entonces la siguiente declaración devolverá un valor nulo:

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