Ich versuche aus einer csv-Datei mittels t4 konstante Produktdaten zu erzeugen.
Irgendwie bekomme ich immer einen Semikolon-Fehler beim Ausfuehren des Template Codes - mir ist aber ueberhaupt nicht klar, warum...
<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Windows.Forms.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
// This is the output code from your template
// you only get syntax-highlighting here - not intellisense
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Globalization;
namespace Product{
class ProductCache {
private static ProductCache _instance;
private Dictionary<string, Product> ProductId2Product=new Dictionary<string, Product>();
private ProductCache()
{
<#
using (var fs = File.OpenRead("productlist.csv"))
using (var textReader = new StreamReader(fs))
{
textReader.ReadLine();
while (!textReader.EndOfStream) {
var line = "Add("+"""+textReader.ReadLine()+"""+");";
this.Write(line);
}
}
#>
}
public static ProductCache Instance
{
get
{
if (_instance != null) return _instance;
_instance = new ProductCache();
return _instance;
}
}
private void Add(string csvString) {
var product=new Product(csvString);
ProductId2Product.Add(product.ProductId, product);
}
}
}
Ich habe den Code auch in einer Consolen Anwendung mit Console.Write statt this.Write ausprobiert und er kompiliert - deswegen stehe ich jetzt auf dem Schlauch.
Wahrscheinlich erzeugt
<#
using (var fs = File.OpenRead("productlist.csv"))
using (var textReader = new StreamReader(fs))
{
textReader.ReadLine();
while (!textReader.EndOfStream) {
var line = "Add("+"""+textReader.ReadLine()+"""+");";
this.Write(line);
}
}
#>
ungültigen Code, der nachher den Fehler auslöst.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Schaut so aus als wären die Quotes falsch (bzw. nicht) escaped:
var line = "Add("+"\""+textReader.ReadLine()+"\""+");";
So gehts.
Habs jetzt - T4 ist wirklich ein bisschen tricky - aber auch sehr maechtig.
Lag es denn jetzt an den Quotes?
Denn das wäre ja keine Eigenheit von T4...
Ja, lag an den Quotes - aber es mehr die Kombination von Kompilier- und Laufzeitfehlern, die mich bei T4 verwirrt hat.
Bei T4 "Run Custom Tool" werden ja sowohl die T4-Anweisungen kompiliert und dann anschliessend zur Generation der Klassen ausgefuehrt.
Das Problem sind mehr die komischen Fehlermeldungen.
Am Schluss habe ich halt wirklich nach jeder Zeile T4 laufen lassen.
Hallo weismat und alle anderen Hilfesuchenden,
Das Problem sind mehr die komischen Fehlermeldungen.
weshalb du sie uns trotz deiner langjährigen Forenerfahrung und trotz [Hinweis] Wie poste ich richtig? Punkt 5 verschwiegen hast?
Es ist ein - leider sehr verbreiteter - Fehlschluss, dass eine Fehlermeldung, die einem selbst nicht hilft, generell nutzlos ist. Was dem Hilfesuchenden nichts sagt, kann und wird für den Helfer trotzdem oft der Schlüssel sein. Deshalb immer die exakte Fehlermeldung mit angeben, und zwar zusammen mit der exakten Codestelle, auf die sie sich bezieht. Und das am besten in [****ERROR]-Tags.
herbivore
Die erste Fehlermeldung lautet "Missing Semikolon" wie im Titel - Du findest keine Code-Stelle, da der Fehler in der generierten .cs Datei angezeigt wird - nicht im eigenen Code.
Also bei mir wurde die Stelle angezeigt, deswegen wusste ich gleich wo ich suchen muss (siehe Anhang)
Wahrscheinlich habe ich die Fehlermeldung übersehen - ich habe mehr auf die erste Fehlermeldung geschaut und die war ein fehlendes Semikolon.
Ich hatte halt lange nix mehr mit T4 gemacht und habe wirklich ne Stunde dran rumgedoktert - "Metaprogramming in .NET" wieder angeschaut und nicht den Fehler gefunden...