En C # 3.0, vous pouvez créer une classe anonyme avec la syntaxe suivante
var o1 = new { Id = 1, Name = "Foo" };
Existe-t-il un moyen de créer dynamiquement ces classes anonymes à une variable?
Exemple:
var o1 = new { Id = 1, Name = "Foo" };
var o2 = new { SQ = 2, Birth = DateTime.Now };
Création dynamique Exemple:
var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo"));
var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth",
DateTime.Now));
Beacuse je dois faire:
dynamic o1 = new ExpandObject();
o1."ID" = 1; <--"ID" is dynamic name
o1."Name" = "Foo"; <--"Name" is dynamic name
Et 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 j'appelle:
dynamic o1 = new ExpandObject();
o1.Name = "123";
ShowPropertiesValue(o1);
Il ne peut pas montrer le résultat:
Name = 123
Et aussi je comment convertir le ExpandoObject à AnonymouseType?
Type type = o1.GetType();
type.GetProperties(); <--I hope it can get all property of o1
Enfin, je modifie la méthode 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));
}
}
}
Comment implémenter la méthode DynamicNewAnonymous ou comment modifier ShowPropertiesValue ()?
Mes motivations sont:
dynamic o1 = new MyDynamic();
o1.Name = "abc";
Type o1Type = o1.GetType();
var props = o1Type.GetProperties(); <--I hope can get the Name Property
Si je peux accrocher la méthode GetType de dynamicObject et Compel, convertir en Type fortement typé. Le code sans soudure ci-dessus peut fonctionner correctement.
Les types anonymes ne sont que des types ordinaires implicitement déclarés. Ils ont peu à voir avec dynamic
.
Maintenant, si vous deviez utiliser un ExpandoObject et le référencer à travers une variable dynamic
, vous pourriez ajouter ou supprimer des champs à la volée.
modifier
Bien sûr, vous pouvez: il suffit de le jeter à IDictionary<string, object>
. Ensuite, vous pouvez utiliser l'indexeur.
Vous utilisez la même technique de diffusion pour parcourir les champs:
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
Le code ci-dessus et plus peuvent être trouvés en cliquant sur ce lien.
Vous pouvez créer un ExpandoObject comme ceci:
IDictionary<string,object> expando = new ExpandoObject();
expando["Name"] = value;
Et après le dynamiser, ces valeurs ressembleront à des propriétés:
dynamic d = expando;
Console.WriteLine(d.Name);
Cependant, elles ne sont pas des propriétés réelles et ne sont pas accessibles via Reflection. Donc, l'instruction suivante retournera un null:
d.GetType().GetProperty("Name")