2010-09-18 3 views
80

En C# 3.0, vous pouvez créer la classe anonyme avec la syntaxe suivanteComment dynamique nouvelle classe anonyme?

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

est-il un moyen de dynamique créer ces classes anonyme à une variable?


Exemple:

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

dynamique créer 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 que 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 je l'appelle:

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

Il ne peut pas montrer le résultat:

Name = 123 

Et aussi comment je convertir les ExpandoObject à AnonymouseType?

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

dernier, 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 le 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 getType de dynamicObject et Compel convertir en type fortement typé. Le code transparent ci-dessus peut fonctionner correctement.

+0

@Vlad: J'avoue que je ne suis pas très clair sur les motivations. –

+0

@VladLazarenko Je pense que vous avez raison :-) – oberfreak

+0

S'il vous plaît dites-nous, ce que vous voulez faire et pourquoi c'est votre solution sélectionnée. – oberfreak

Répondre

61

Les types anonymes sont simplement des types réguliers qui sont déclarés implicitement. Ils ont peu à faire avec dynamic.

Maintenant, si vous deviez utiliser un ExpandoObject et le référencer via une variable dynamic, vous pourriez 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 coulée à itérer sur 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 vues en cliquant sur ce lien.

+1

Mais ExpandoObject ne peut pas le faire: 'dynamic o1 = new ExpandObject(); o1. "ID" = 1; o1. "Name" = "Foo"; ' – Flash

+0

Mais il ne peut pas non plus faire: Type o1Type = o1.GetType(); var props = o1Type.GetProperties(); les accessoires sont vides – Flash

+1

Tout ce que vous faites c'est de dire que les propriétés dynamiques ne sont pas identiques aux propriétés fortement typées. C'est trivialement vrai. –

5

Vous pouvez créer un ExpandoObject comme ceci:

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

Et après la coulée à dynamique, ces valeurs ressemblerez propriétés:

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

, ils ne sont cependant pas des propriétés réelles et ne peuvent pas être accédé en utilisant Reflection. Ainsi, la déclaration suivante renverra une valeur nulle:

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