3 votes

Les types anonymes peuvent-ils être utilisés dans les modèles de texte?

Je rédige un modèle de texte et j'ai la ligne de code suivante :

Tuple[] tupleArray = new[]
    {
        new Tuple("apple", 4, true),
        new Tuple("grape", 1, false)
    };

J'aimerais convertir ceci en un tableau de types anonymes :

var anonArray = new[]
    {
        new {Name = "apple", Diam = 4, Tasty = true},
        new {Name = "grape", Diam = 1, Tasty = false}
    };

Cependant, le modèle de texte, bien qu'il semble être une fonction unique et continue, ne permet pas l'utilisation de variables locales de type implicite.

Existe-t-il un moyen simple de contourner cette limitation et d'utiliser des types anonymes dans un modèle de texte ?

3voto

Tejs Points 23834
Dictionnaire set = 
  {
      { "pomme", 4 },
      { "raisin", 1 }
  }

C'est probablement aussi concis que possible.

MODIFIER : Si vous voulez vraiment la possibilité d'utiliser des objets anonymes, vous pouvez toujours opter pour le basique dynamic tableau :

dynamic[] array = new dynamic[] { new { Nom = "Pomme", Diamètre = 4 }, ... }

Et ensuite utiliser le late binding pour accéder à vos propriétés. Ce n'est pas comme si les modèles T4 avaient une intellisense de toute façon.

1voto

GarethJ Points 4261

Cela devrait fonctionner parfaitement. Dans Visual Studio 2010, j'ai collé votre code anonArray directement dans un modèle puis j'ai bouclé sur le tableau avec un foreach et tout s'est bien passé, comme je m'y attendais. Voici le code en tant que modèle.


<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
<#
    var anonArray = new[] {
        new {Name = "apple", Diam = 4, Tasty = true},
        new {Name = "grape", Diam = 1, Tasty = false},
    };
#>
<# foreach ( var foo in anonArray) { #>
Bonjour <#= foo.Name #> de type <#= foo.GetType() #>
<# } #> 

T4 se contente d'étendre le modèle avec un peu de boilerplate puis exécute le compilateur C# dessus via le CodeDOM, donc en général, ce qui fonctionne à l'intérieur d'une méthode en C#, fonctionne dans le corps d'un modèle T4. Si vous voulez voir ce que nous compilons, collez votre code de modèle dans un modèle (pré-traité) en cours d'exécution et vous verrez l'expansion en tant que sortie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X