基于对象列表的动态模板

时间:2012-12-21 17:18:03

标签: c# .net templates object dynamic

在以下方案中自动生成模板的最佳方法是什么?

一组物品:

Article
  |- Id
  |- Text
Gallery
  |- Id
  |- Type
  |- List<Photos>
Video
  |- Id
  |- VideoHash

所有这些对象都位于var list = new List<dynamic>()。所以页面包括:

1. article
2. gallery
3. article
4. video

会有这样的对象:

list.Add(Article)
list.Add(Gallery)
list.Add(Article)
list.Add(Video)

现在我的问题是,为特定对象创建模板的最佳方法是什么,然后在生成调用特定模板的页面时,将其与对象数据绑定并作为.ToString()发送到浏览器。

是否可以使用.net或者我是否必须使用一些模板库?

更新

为了澄清问题,我想问什么是从动态列表为网站生成HTML代码的最佳技术,库,组件。

想法是我为文章,视频,图库创建HTML模板,然后我运行页面,它将生成包含从此动态列表生成的模板的整个页面。

1 个答案:

答案 0 :(得分:1)

动力学不是类型安全的,不提供智能感知。在大多数情况下,您应该避免它们。而是创建一个类层次结构

public class Item
{
    public int Id { get; set; }
}

public class Article : Item
{
    public string Text { get; set; }
}

public class Gallery : Item
{
    public string Type { get; set; }
    public List<Photo> Photos { get; set; }
}

public class Video : Item
{
    public string VideoHash { get; set; }
}

现在您可以创建项目列表

var list = new List<Item>();
lst.Add(new Article { Id = 1, Text = "test" });
lst.Add(new Video { Id = 1, VideoHash = "34Rgw^2426@62#$%" });

一个类充当对象的模板。派生类继承基类中的成员(此处为Id)。


<强>更新

T4模板migth看起来像这样

<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" language="C#v3.5" debug="true" hostSpecific="true" #>
<#@ output extension=".html" #>
<#@ Assembly Name="System.dll" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly name="mscorlib.dll" #>
<#@ Assembly name="C:\Users\Oli\Documents\Proj\CySoft\StackOverflowTests\StackOverflowTests\bin\Debug\StackOverflowTests.exe" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="StackOverflowTests.CreateHtmlFromClasses" #>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <h1>Example</h1>
    <table style="Width:100%;">
        <# this.AddProperties(new Article { Id = 77, Text = "The quick brown fox." }); #>
    </table>
</body>
</html>
<#+
    private void AddProperties(object obj)
    {
        Type type = obj.GetType();
        var properties = type.GetProperties();#>
        <tr>
            <td>
                <b><#= type.Name #></b>
            </td>
        </tr>
<#+         foreach (PropertyInfo property in properties) {
#>      <tr>
            <td>
                <#= property.Name #>
            </td>
            <td>
                <#= property.GetValue(obj, null).ToString() #>
            </td>
        </tr>
<#+
        }   
    }
#>

此示例不是一个真实的示例,因为它使用的对象的值只会在运行时存在。您只会根据类型执行操作。模板引擎无法访问当前项目的类型。因此,您必须将它放在另一个项目中。