. However, I'd like to be able to use a nested class within a generic as the base type, as in:
public class SparkEmailRenderer<DataType>
{
public class RendererView : AbstractSparkView
{
private Guid generatedViewId;
public RendererView() { generatedViewId = Guid.NewGuid(); }
public DataType Model { get; set; }
public override Guid GeneratedViewId { get { return this.generatedViewId; } }
public override void Render() { throw new NotImplementedException(); }
}
public SparkEmailRenderer(String templateString)
{
this.templateString = templateString;
}
public String Render(DataType data)
{
SparkSettings settings = new SparkSettings().SetPageBaseType(typeof(RendererView));
InMemoryViewFolder templates = new InMemoryViewFolder();
SparkViewEngine engine = new SparkViewEngine(settings) { ViewFolder = templates };
templates.Add("renderer.spark", this.templateString);
SparkViewDescriptor descriptor = new SparkViewDescriptor();
descriptor.AddTemplate("renderer.spark");
RendererView view = (RendererView) engine.CreateInstance(descriptor); // exception here
view.Model = data;
using (StringWriter stringWriter = new StringWriter())
{
view.RenderView(stringWriter);
stringWriter.Flush();
return stringWriter.ToString();
}
}
My very simple test case is this:
[TestMethod]
public void TestMethod1()
{
SparkEmailRendererFactory<Int32> factory = new SparkEmailRendererFactory<Int32>();
IEmailRenderer<SampleData> renderer = factory.BuildRenderer<SampleData>(@"This is some string data: ${Model.StringData}.
<for each='var tuple in Model.ListData'>
- ${tuple.Item1} | ${tuple.Item2}
</for>");
SampleData sampleData = new SampleData
{
StringData = "!@#$%^&*()"
, ListData = Enumerable.Range(1, 9).Select(i => new Tuple<Int32, Double>(i, i * 1.1)).ToList()
};
String result = renderer.Render(sampleData);
Assert.AreEqual(result,@"This is some string data: !@#$%^&*().
- 1 | 1.1
- 2 | 2.2
- 3 | 3.3
- 4 | 4.4
- 5 | 5.5
- 6 | 6.6
- 7 | 7.7
- 8 | 8.8
- 9 | 9.9");
}
I keep getting a dynamic view compilation error on public class View3d480988a882485c98ed589523d9e8b4 : Full.Name.For.SparkEmailRenderer`1+RendererView[[Full.Name.For.SampleData,
Test.Assembly.Name, Version=2.0.2.0, Culture=neutral, PublicKeyToken=c5e39879b2509991]]
If I change the line about SparkSettings settings = new SparkSettings().SetPageBaseType(typeof(RendererView)); to just be the string literal Full."Name.For.SparkEmailRenderer.RendererView<Full.Name.For.SampleData>", it works, but that obviously won't work in the real world.
Any ideas on how to get that class name to render correctly? Do I have to do it myself, or is there a way to get Spark to figure it out?
Thanks!