2010-12-12 2 views
3

Ich versuche Dot Liquid zu verwenden, die eine der coolsten Templating-Engines für C# ist. Dot Liquid verwendet einen Weg, um die Verwendung von Vorlagen sicher zu machen. Hier Here is the explanation page.Erstellen Sie eine DataRow-Klasse, die ILiquidizable implementiert

ist die Erklärung von ihr Wiki ist:

DotLiquid, standardmäßig akzeptiert nur eine begrenzte Anzahl von Typen als Parameter auf die Render-Methode - einschließlich der .NET Urtyp (int, float, Zeichenkette, etc.), und einige Sammlung Typen einschließlich IDictionary, IList und IIndexable (eine benutzerdefinierte DotLiquid Schnittstelle).

Wenn es beliebige Typen unterstützt, dann es in Eigenschaften oder Methoden unbeabsichtigt ausgesetzt zu Vorlage Autoren führen könnte. Um dies zu verhindern, verwendet DotLiquid Drop-Objekte. Drops verwenden einen Opt-In-Ansatz zum Aussetzen von Objekt Daten.

The Drop-Klasse ist nur eine Implementierung von ILiquidizable und der einfachste Weg, Ihre Objekte DotLiquid Vorlagen implementieren ILiquidizable direkt

Wiki Beispielcode ist aussetzen:

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]" 
    }) 
})); 

Also, wenn ich DataRow zu Flüssigkeit übergebe, lasse Flüssigkeit mir seinen Inhalt zeigen und sagt mir:

‚System.Data.DataRow‘ ist ungültig , weil es weder ein integrierter Typ noch implementiert ILiquidizable

Gibt es irgendwelche Lösungen DataRow Objekt zu übergeben, die ILiquidizable auch implementiert? Danke

+1

Wahrscheinlich müssen Sie die 'DataRow' in eine eigene Klasseninstanz konvertieren, die' ILiquidizable' implementiert. Ich sehe nicht, wie Sie eine vorhandene Klasse wie 'DataRow' plötzlich eine neue Schnittstelle unterstützen könnten .... –

Antwort

5

Wie marc_s angegeben, müssen Sie das Objekt DataRow in Ihre eigene Klasseninstanz konvertieren oder es zumindest mit Ihrer eigenen Klasseninstanz umhüllen. Ich würde vorschlagen, dass es so Einwickeln:

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; 
    } 
} 

Verwendungsbeispiel wäre:

[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) 
    }))); 
} 

Ich habe dieses Beispiel auch Drop-Klasse und den entsprechenden Unit-Test, mit den unit tests for DotLiquid drops hinzugefügt.

+0

in einigen Fällen muss DbNull überprüfen:' code' if (_dataRow.Table.Columns.Contains (Methode) &&! _dataRow.IsNull (Methode)) obj = _dataRow [Methode]; 'Code' –

Verwandte Themen