2010-03-09 49 views
0

我使用字符串模板来呈现一些内容,但内容可以是可变的所以不知道如何将它传递(使用.NET/C#)StringTemplate的.NET动态对象

基本的想法是我有一个List >这需要以参数结束,例如

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)); 

现在我想这些在字符串模板显示为:

$ item.elem1 $ $ item.elem2 $

我可以让他们为$ elem1 $或$ elem2时$但我需要它们在一个结构内。所以我实际上需要说服我传入的属性为elem1和elem2的对象的字符串模板setAttribute,实际上我有一个KeyValuePairs列表。

谢谢

回答

4

其实很小的重写应该工作。你需要使用字典,你甚至可以嵌套它们(使用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")); 
} 

我和同事正在寻找复制STST(ST独立工具)时,它使用JSON作为性功能,我们建立了一个简单的JObject到字典转换器,我可以发布该代码和一个例子,如果它对你有用,它只有20行。

+0

最后,我最终使用CS-Script来运行一些动态创建的代码,包含对象......这对我们很有用,因为我们已经在同一个项目的其他地方运行了动态代码......但如果我们需要更多的优化,可能会回到它并使用您的解决方案。 – 2010-04-17 10:08:27

+0

这似乎并没有回答上面的问题? – Xian 2011-01-16 09:04:33

0

ExpandoObject的成员可以在运行时动态添加和删除。

+1

在这个时间点,Expando对象似乎不适用于StringTemplate。 – shashi 2013-06-13 11:16:44