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 dans une variable?
Exemple:
var o1 = new { Id = 1, Name = "Foo" };
var o2 = new { SQ = 2, Birth = DateTime.Now };
Exemple de création dynamique:
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 afficher le résultat:
Name = 123
Et aussi comment convertir ExpandoObject en 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 la 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 forcer la conversion en type fortement typé. Le code Seamless ci-dessus peut fonctionner correctement.
c#
c#-3.0
anonymous-types
Éclat
la source
la source
Réponses:
Les types anonymes ne sont que des types réguliers qui sont déclarés implicitement. Ils ont peu à voir avec
dynamic
.Maintenant, si vous deviez utiliser un ExpandoObject et le référencer via une
dynamic
variable, vous pouvez ajouter ou supprimer des champs à la volée.Éditer
Bien sûr que vous pouvez: il suffit de le lancer
IDictionary<string, object>
. Ensuite, vous pouvez utiliser l'indexeur.Vous utilisez la même technique de diffusion pour parcourir les champs:
Le code ci-dessus et plus peuvent être trouvés en cliquant sur ce lien.
la source
dynamic o1 = new ExpandObject(); o1."ID" = 1; o1."Name" = "Foo";
((IDictionary<string, object>)o1).Add("Name", "Foo");
. Vous pouvez ensuite accéder en tant queo1.Name
Vous pouvez créer un ExpandoObject comme ceci:
Et après la conversion en dynamique, ces valeurs ressembleront à des propriétés:
Cependant, ce ne sont pas des propriétés réelles et ne sont pas accessibles à l'aide de Reflection. Ainsi, l'instruction suivante renverra un null:
la source
Bien sûr, il est possible de créer des classes dynamiques en utilisant la classe ExpandoObject très cool. Mais récemment, j'ai travaillé sur un projet et j'ai fait face à ce que Expando Object n'est pas réalisé dans le même format sur xml qu'une simple classe Anonymous, c'était dommage = (, c'est pourquoi j'ai décidé de créer ma propre classe et de la partager avec vous. réflexion et directive dynamique, construit l'assemblage, la classe et l'instance de manière vraiment dynamique. Vous pouvez ajouter, supprimer et modifier à la volée les propriétés incluses dans votre classe. Voici:
Il est également très simple d'utiliser DynamicTypeBuilder, il vous suffit de mettre quelques lignes comme ceci:
J'espère que cet extrait de code aidera quelqu'un =) Profitez-en!
la source