public override string BuildTypeName(Type templateType, Type modelType) { if (templateType == null) { throw new ArgumentNullException("templateType"); } var modelTypeName = CompilerServicesUtility.ResolveVBTypeName(modelType); return(CompilerServicesUtility.VBCreateGenericType(templateType, modelTypeName, false)); }
protected virtual bool ModelTypeDirective() { AssertDirective("ModelType"); Span.CodeGenerator = SpanCodeGenerator.Null; Context.CurrentBlock.Type = BlockType.Directive; AcceptAndMoveNext(); SourceLocation endModelLocation = CurrentLocation; if (At(VBSymbolType.WhiteSpace)) { Span.EditHandler.AcceptedCharacters = AcceptedCharacters.None; } AcceptWhile(VBSymbolType.WhiteSpace); Output(SpanKind.MetaCode); if (_modelStatementFound) { Context.OnError(endModelLocation, "Only one 'ModelType' statement is allowed in a file."); } _modelStatementFound = true; if (EndOfFile || At(VBSymbolType.WhiteSpace) || At(VBSymbolType.NewLine)) { Context.OnError(endModelLocation, "The 'ModelType' keyword must be followed by a type name on the same line."); } // Just accept to a newline AcceptUntil(VBSymbolType.NewLine); if (!Context.DesignTimeMode) { // We want the newline to be treated as code, but it causes issues at design-time. Optional(VBSymbolType.NewLine); } string baseType = String.Concat(Span.Symbols.Select(s => s.Content)).Trim(); Span.CodeGenerator = new SetModelTypeCodeGenerator(baseType, (templateType, modelTypeName) => { return(CompilerServicesUtility.VBCreateGenericType(templateType, modelTypeName, true)); }); CheckForInheritsAndModelStatements(); Output(SpanKind.Code); return(false); }