En C # 3.0 puede crear una clase anónima con la siguiente sintaxis
var o1 = new { Id = 1, Name = "Foo" };
¿Hay alguna forma de crear dinámicamente estas clases anónimas en 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 hacer:
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 conectar el método GetType de dynamicObject, y Compel convertir a tipo fuertemente tipado. El código Seamless anterior puede funcionar bien.
c#
c#-3.0
anonymous-types
Destello
fuente
fuente
Respuestas:
Los tipos anónimos son solo tipos regulares que se declaran implícitamente. Tienen poco que ver
dynamic
.Ahora, si tuviera que usar un ExpandoObject y hacer referencia a él a través de una
dynamic
variable, podría agregar o eliminar campos sobre la marcha.editar
Seguro que puedes: solo envíalo a
IDictionary<string, object>
. Entonces puedes usar el indexador.Utiliza la misma técnica de conversión para iterar sobre los campos:
El código anterior y más se pueden encontrar haciendo clic en ese enlace.
fuente
dynamic o1 = new ExpandObject(); o1."ID" = 1; o1."Name" = "Foo";
((IDictionary<string, object>)o1).Add("Name", "Foo");
. A continuación, puede acceder comoo1.Name
Puede crear un ExpandoObject como este:
Y después de convertirlo en dinámico, esos valores se verán como propiedades:
Sin embargo, no son propiedades reales y no se puede acceder a ellas mediante Reflection. Entonces, la siguiente declaración devolverá un nulo:
fuente
Por eso es posible crear clases dinámicas usando la clase ExpandoObject muy interesante. Pero recientemente trabajé en un proyecto y me enfrenté a que el Objeto Expando no se realiza en el mismo formato en xml que una clase Anónima simple, fue una lástima = (, es por eso que decidí crear mi propia clase y compartirla contigo. Está usando Reflexión y directiva dinámica, construye Ensamblaje, Clase e Instancia de manera verdaderamente dinámica. Puede agregar, eliminar y cambiar propiedades que están incluidas en su clase sobre la marcha. Aquí está:
También es muy simple usar DynamicTypeBuilder, solo necesita poner algunas líneas como esta:
Espero que este fragmento de código ayude a alguien =) ¡Disfrute!
fuente