2010-12-12 13 views
3

私はDot Liquidを使用しようとしています。これは、C#の最もクールなテンプレートエンジンの1つです。 ドット・リキッドは、テンプレートを安全に使用するための方法を使用しています。ここでHere is the explanation page.ILiquidizableを実装するDataRowクラスを作成する

それから説明がwikiのです:Renderメソッドへ をパラメータとして

DotLiquid、デフォルトでは、唯一のタイプの 限られた数を受け入れる - .NETプリミティブ型(を含みますfloat、 文字列など)、およびいくつかのコレクション (IDictionary、IListおよび IIndexable(カスタムDotLiquid インターフェイス)を含むタイプです。

それは、任意の種類をサポートしている場合、 それはプロパティまたは意図せずに、テンプレートの作者に を暴露され 方法につながる可能性があります。これを防ぐために、 DotLiquidはDropオブジェクトを使用します。オブジェクト を公開するオプトインアプローチを使用して、 を使用してください。

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 = "[email protected]" 
    }) 
})); 

ドロップクラスには、ちょうど1 ILiquidizableの実装、および 実装である にDotLiquidテンプレートに直接

ウィキサンプルコードILiquidizableをご オブジェクトを公開する最も簡単な方法です

DataRowを液体に渡すと、液体が表示されなくなります。

は「System.Data.DataRow」は無効です ことがあるので、どちらのタイプ ビルトインも

ILiquidizableをあまりにも実装するDataRowオブジェクトを渡すために任意のソリューションがありますILiquidizable実装しますか? ありがとう

+1

おそらく 'DataRow'を' ILiquidizable'を実装しているあなた自身のクラスインスタンスに変換する必要があります。私はあなたが 'DataRow'のような既存のクラスを突然新しいインターフェースをサポートする方法を見ていません.... –

答えて

5

マークされているように、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) 
    }))); 
} 

私もunit tests for DotLiquid dropsに、この例では、クラスをドロップすると、対応するユニットテストを追加しました。

+0

はDbNullをチェックする必要があります:' code' if(_dataRow.Table.Columns.Contains(method) &&!_dataRow.IsNull(メソッド)) obj = _dataRow [メソッド]; 'code' –

関連する問題