2010-03-09 9 views
0

J'utilise modèle de chaîne pour rendre un contenu, mais le contenu peut être variable afin de ne pas sûr de savoir comment passer en (utilisant .net/C#)StringTemplate objet dynamique .net

idée de base est que j'ai une liste > qui doivent finir en tant que paramètres, par exemple

List<KeyValuePair<string, object>> ret = new List<KeyValuePair<string, object>>(); 
ret.Add(new KeyValuePair<string, object>("elem1", true)); 
ret.Add(new KeyValuePair(string, object>("elem2", false)); 

Maintenant, je veux que ces de se présenter dans le modèle de chaîne comme:

$ item.elem1 $ item.elem2 $

$

Je peux les amener à être elem1 $ $ ou $ elem2 $ mais j'ai besoin d'eux à l'intérieur d'une structure. Donc, j'ai en effet besoin de convaincre le modèle de chaîne setAttribute que je passe dans un objet avec les propriétés elem1 et elem2 alors qu'en fait j'ai une liste de KeyValuePairs.

Merci

Répondre

4

En fait, une très petite re-écriture qui devrait fonctionner. Vous devez utiliser un dictionnaire, et vous pouvez les même nid (en utilisant ST 3.2):

[Test] 
public void When_Building_Text_With_A_Dictionary_As_The_Attributes_It_Should_Map_Members_To_Keys() 
{ 
    IDictionary<string, object> ret = new Dictionary<string, object>(); 
    ret["elem1"] = true; 
    ret["elem2"] = false; 

    var nestedObj = new Dictionary<string, object>(); 
    nestedObj["nestedProp"] = 100; 
    ret["elem3"] = nestedObj; 

    var template = new StringTemplate("$elem1$ or $elem2$ and value: $elem3.nestedProp$"); 
    template.Attributes = ret; 

    StringBuilder sb = new StringBuilder(); 
    StringWriter writer = new StringWriter(sb); 
    template.Write(new NoIndentWriter(writer)); 
    writer.Flush(); 

    var renderedText = sb.ToString(); 

    Assert.That(renderedText, Is.EqualTo("True or False and value: 100")); 
} 

Moi-même et un collègue étaient à la recherche de reproduire la fonctionnalité de STST (ST outil autonome), qui utilise JSON comme les propriétés , et nous avons construit un simple convertisseur JObject en dictionnaire, je peux poster ce code et un exemple si cela vous sert à quelque chose, c'est seulement ~ 20 lignes. Les membres peuvent être dynamiquement ajoutés et supprimés lors de l'exécution. Les membres

+0

Merci, finalement j'ai fini par utiliser CS-Script pour exécuter du code que je crée dynamiquement contenant l'objet ... cela a fonctionné pour nous car nous étions déjà en train d'exécuter du code dynamique dans d'autres endroits du même projet ... mais peut y revenir et utiliser votre solution si nous avons besoin de plus d'optimisation. –

+0

Cela ne semble pas répondre au problème ci-dessus? – Xian

0

+1

L'objet Expando ne semble pas fonctionner avec StringTemplate à ce stade. – shashi