Comment une nouvelle dynamique de la Classe Anonyme?
En C# 3.0, vous pouvez créer la classe anonyme avec la syntaxe suivante
var o1 = new { Id = 1, Name = "Foo" };
Est-il un moyen de dynamique de création de ces anonymes de la classe d'une variable?
Exemple:
var o1 = new { Id = 1, Name = "Foo" };
var o2 = new { SQ = 2, Birth = DateTime.Now };
Dynamique créez Exemple:
var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo"));
var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth",
DateTime.Now));
Car j'ai besoin de le 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 je l'appelle:
dynamic o1 = new ExpandObject();
o1.Name = "123";
ShowPropertiesValue(o1);
Il ne peut pas afficher 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
Dernier, j'ai modifier ShowPropertiesValue() la méthode
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 mettre en œuvre DynamicNewAnonymous méthode ou comment modifier le ShowPropertiesValue()?
Mes motivations:
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 crochet dynamicObject de la Méthode GetType, et les Obliger convertir fortement typées Type.
Le ci-dessus sans couture de code peut fonctionner correctement.
- J'avoue que je suis un peu confus au sujet de l'motivations.
- Je pense que vous avez raison 🙂
- Veuillez nous dire ce que vous voulez faire et pourquoi c'est la solution que vous avez choisie.
- ExpandoObject, pas ExpandObject (ajouté "o").
- Cet article peut aider à trouver votre motivation de l'utilisation de l'un ou de l'autre: blogs.msdn.com/b/csharpfaq/archive/2010/01/25/...
Vous devez vous connecter pour publier un commentaire.
Anonyme types sont juste des types qui sont déclarées implicitement. Ils ont peu à voir avec
dynamic
.Maintenant, si vous deviez utiliser un ExpandoObject et de référence à travers une
dynamic
variable, vous pouvez ajouter ou supprimer des champs à la volée.modifier
Bien sûr, vous pouvez: il suffit de le jeter aux
IDictionary<string, object>
. Ensuite, vous pouvez utiliser l'indexeur.Vous utilisez la même technique de moulage pour itérer sur les champs:
Le code ci-dessus et plus peut être trouvé en cliquant sur ce lien.
dynamic o1 = new ExpandObject(); o1."ID" = 1; o1."Name" = "Foo";
((IDictionary<string, object>)o1).Add("Name", "Foo");
. Vous pouvez ensuite accéder commeo1.Name
Vous pouvez créer un ExpandoObject comme ceci:
Et après un moulage dynamique, ces valeurs ressemblent à des propriétés:
Cependant, ils ne sont pas réels propriétés et ne peut être consulté à l'aide de la Réflexion. Donc l'instruction suivante renvoie null:
De cause, il est possible de créer des classes dynamiques à l'aide de très cool ExpandoObject classe.
Mais récemment, j'ai travaillé sur le projet et a fait face à la Expando Objet est serealized qui n'est pas le même format xml comme un simple Anonyme, c'est dommage =( , c'est pourquoi j'ai décidé de créer ma propre classe et de le partager avec vous. C'est à l'aide de la réflexion et de la dynamique de la directive , s'appuie Assemblée, de Classe et d'Instance véritablement dynamicly. Vous pouvez ajouter, supprimer et modifier les propriétés qui est inclus dans votre classe à la volée
Ici, il est :
Il est également très simple à utiliser DynamicTypeBuilder, vous avez juste besoin de mettre quelques lignes comme ceci:
J'espère que ce petit bout de code aider quelqu'un =) Profitez-en!