Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使实现ILIQuilizable的DataRow类_.net_Asp.net_Liquid - Fatal编程技术网

.net 使实现ILIQuilizable的DataRow类

.net 使实现ILIQuilizable的DataRow类,.net,asp.net,liquid,.net,Asp.net,Liquid,我正在尝试使用c#最酷的模板引擎之一。 点液体使用一种方法,以使使用模板的安全 以下是来自维基的解释: public class User { public string Name { get; set; } public string Email { get; set; } } public class UserDrop : Drop { private readonly User _user; public string Name {

我正在尝试使用c#最酷的模板引擎之一。 点液体使用一种方法,以使使用模板的安全

以下是来自维基的解释:

public class User
{
    public string Name { get; set; }
    public string Email { get; set; }
}

public class UserDrop : Drop
{
    private readonly User _user;

    public string Name
    {
        get { return _user.Name; }
    }

    public UserDrop(User user)
    {
        _user = user;
    }
}

Template template = Template.Parse("Name: {{ user.name }}; Email: {{ user.email }};");
string result = template.Render(Hash.FromAnonymousObject(new
{
    user = new UserDrop(new User
    {
        Name = "Tim",
        Email = "me@mydomain.com"
    })
}));
默认情况下,DotLiquid只接受 作为参数的类型数量有限 到渲染方法-包括 .NET基本类型(int、float、, 字符串等)和一些集合 类型包括IDictionary、IList和 IIndexable(自定义点云) 接口)

如果它支持任意类型,那么 这可能导致财产或财产损失 无意中暴露的方法 模板的作者。为防止此,, DotLiquid使用Drop对象。滴剂使用 一种公开对象的选择性加入方法 数据

辍学班只是其中之一 可流动性的实施,以及 暴露您的 指向DotLiquid模板的对象是 直接实现ILiquidizable

Wiki示例代码:

public class User
{
    public string Name { get; set; }
    public string Email { get; set; }
}

public class UserDrop : Drop
{
    private readonly User _user;

    public string Name
    {
        get { return _user.Name; }
    }

    public UserDrop(User user)
    {
        _user = user;
    }
}

Template template = Template.Parse("Name: {{ user.name }}; Email: {{ user.email }};");
string result = template.Render(Hash.FromAnonymousObject(new
{
    user = new UserDrop(new User
    {
        Name = "Tim",
        Email = "me@mydomain.com"
    })
}));
因此,当我将DataRow传递给liquid时,liquid不会让我显示其内容并告诉我:

“System.Data.DataRow”无效 因为它既不是内置类型 也不是不可流动的

是否有任何解决方案可以传递也实现ILiquidizable的DataRow对象?
谢谢

正如marc_指出的,您需要将
DataRow
对象转换为您自己的类实例,或者至少用您自己的类实例包装它。我建议这样包装:

internal class DataRowDrop : Drop
{
    private readonly DataRow _dataRow;

    public DataRowDrop(DataRow dataRow)
    {
        _dataRow = dataRow;    
    }

    public override object BeforeMethod(string method)
    {
        if (_dataRow.Table.Columns.Contains(method))
            return _dataRow[method];
        return null;
    }
}
示例用法为:

[Test]
public void TestDataRowDrop()
{
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add("Column1");
    dataTable.Columns.Add("Column2");

    DataRow dataRow = dataTable.NewRow();
    dataRow["Column1"] = "Hello";
    dataRow["Column2"] = "World";

    Template tpl = Template.Parse(" {{ row.column1 }} ");
    Assert.AreEqual(" Hello ", tpl.Render(Hash.FromAnonymousObject(new
    {
        row = new DataRowDrop(dataRow)
    })));
}

我还将这个示例drop类和相应的单元测试添加到了。

您可能需要将
DataRow
转换为您自己的类实例,它实现了
ILiquidizable
。我不明白如何让像
DataRow
这样的现有类突然支持一个新接口……在某些情况下,可能需要检查DbNull:
code
if(_DataRow.Table.Columns.Contains(method)&&!_DataRow.IsNull(method))obj=_DataRow[method]<代码>代码