【问题标题】:stringtemplate .net dynamic objectstringtemplate .net 动态对象
【发布时间】:2011-01-25 12:56:16
【问题描述】:

我正在使用字符串模板来呈现一些内容,但内容可能是可变的,因此不确定如何传递它(使用 .net / c#)

基本思想是我有一个 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$ 但我需要它们在结构内。所以我实际上需要说服字符串模板 setAttribute 我正在传递一个具有属性 elem1 和 elem2 的对象,而实际上我有一个 KeyValuePairs 列表。

谢谢

【问题讨论】:

    标签: c# .net stringtemplate


    【解决方案1】:

    实际上,一个非常小的重写应该可以工作。您需要使用字典,甚至可以嵌套它们(使用 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行。

    【讨论】:

    • 谢谢,最后我最终使用 CS-Script 运行了一些我动态创建的包含对象的代码......这对我们有用,因为我们已经在其他地方运行动态代码同一个项目......但如果我们需要更多优化,可能会回到它并使用您的解决方案。
    • 这似乎没有回答上面的问题?
    • 我可以使用代码将 JObject 转换为字典
    【解决方案2】:

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

    【讨论】:

    • Expando 对象目前似乎不适用于 StringTemplate。
    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多