2010-08-24 3 views
1

Considérez ce qui suit:Est-il possible de mettre en œuvre setters sur les propriétés des types anonymes

var o = new { Foo = "foo", Bar = "bar" }; 

Cette instance est en lecture seule, car le type anonyme ne met pas en œuvre setters comme une classe ne:

public class O 
{ 
    public String Foo { get; set; } 
    public String Bar { get; set; } 
} 

Est-il possible d '"ouvrir" l'instance anonyme et de modifier ses propriétés? De préférence en moins de caractères qu'il n'en faudrait pour créer une classe.

Je pense que cela peut être fait avec une méthode d'extension sur Object; o.SetProperty(o.Foo, "foo!");, si vous ne pouvez pas implémenter des setters en ligne lors de la construction de l'objet.

Répondre

3

Les types anonymes sont immuables par conception, vous ne pouvez donc pas modifier leur état. Vous pouvez utiliser la réflexion (comme Mark Gravell l'a souligné correctement), mais ce n'est pas non plus une performance souhaitable, ni d'un point de vue design.

Vous avez plusieurs options pour contourner ce problème:

  • Utilisation Tuples au lieu de types annonymous. Notez qu'ils sont également immuables mais vous pouvez travailler plus facilement avec eux pour créer des méthodes comme tupleA.WithItem2(newValueForItem2). Semblable à la classe string.
  • écrire votre propre type « nommé » en utilisant les propriétés d'auto, généralement simples
  • utiliser un outil de refactoring comme CodeRush qui peut générer un type « nom » de votre utilisation
+0

L'affirmation sur la réflexion est invalide: ce qui suit fonctionne bien: 'var obj = new {id = 1, name =" abc "}; obj.GetType(). GetFields (BindingFlags.Instance | BindingFlags.NonPublic) .Single (f => f.FieldType == typeof (int)). SetValue (obj, 456); Console.WriteLine (obj.id); ' –

7

Non, car les types anonymes en C# sont immuables par conception.

+0

Eh bien, C# types anonymes sont (et même la question est étiquetée C#). Je souligne simplement que c'est une fonctionnalité du compilateur spécifique, pas des "types anonymes" en soi. –

+0

@Marc: Bon point, et je suppose que la raison pour laquelle les types anonymes sont immuables en premier lieu est liée à la façon dont ils sont généralement utilisés dans LINQ. –

+0

+1 Merci. J'ai accepté la réponse plus élaborée de Johannes. Il touche à quelques alternatives. – roosteronacid

Questions connexes