void generateDiscoveryClass ()
{
CodeTypeDeclaration discoveryClass = new CodeTypeDeclaration ("DiscoveryProvider");
discoveryClass.BaseTypes.Add (typeof(ITemplateInstanceDiscoveryProvider));
ns.Types.Add (discoveryClass);
CodeMemberMethod discoverInstanceMethod = new CodeMemberMethod ();
discoverInstanceMethod.Parameters.Add (new CodeParameterDeclarationExpression (typeof(string), "path"));
discoverInstanceMethod.Name = "DiscoverInstance";
discoverInstanceMethod.ReturnType = new CodeTypeReference (typeof(TemplateRenderResource));
discoverInstanceMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final;
discoveryClass.Members.Add (discoverInstanceMethod);
foreach (GeneratedResourceClass generatedClass in this.generatedResourcesClassNames)
{
CodeConditionStatement condition = new CodeConditionStatement ();
condition.Condition = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("path"), CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (generatedClass.DiscoveryPath));
condition.TrueStatements.Add (new CodeMethodReturnStatement (new CodeObjectCreateExpression (
getResourceFullTypeName (generatedClass.ClassName))));
discoverInstanceMethod.Statements.Add (condition);
}
discoverInstanceMethod.Statements.Add (new CodeMethodReturnStatement (new CodePrimitiveExpression (null)));
// Generate Discovery Attribute
this.codeCompilerUnit.AssemblyCustomAttributes.Add (
new CodeAttributeDeclaration (
new CodeTypeReference (typeof(TemplateInstanceDiscoveryProviderAttribute)),
new CodeAttributeArgument[] {
new CodeAttributeArgument ("DiscoveryType",
new CodeTypeOfExpression (getResourceFullTypeName (discoveryClass.Name)))}));
}