.net 使实现ILIQuilizable的DataRow类
我正在尝试使用c#最酷的模板引擎之一。 点液体使用一种方法,以使使用模板的安全 以下是来自维基的解释:.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 {
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]<代码>代码