private TemplateItem ProcessDirective(Directive directive, TemplateItem item) { #region 包含include if (String.Equals(directive.Name, "include", StringComparison.OrdinalIgnoreCase)) { String name = directive.GetParameter("name"); // 可能采用了相对路径 if (!File.Exists(name)) name = Path.Combine(Path.GetDirectoryName(item.Name), name); String content = null; TemplateItem ti = FindTemplateItem(name); if (ti != null) { ti.Included = true; content = ti.Content; } else { // 尝试读取文件 if (File.Exists(name)) { ti = new TemplateItem(); ti.Name = name; ti.Content = File.ReadAllText(name); Templates.Add(ti); ti.Included = true; content = ti.Content; } } // 允许内容为空 //if (String.IsNullOrEmpty(content)) throw new TemplateException(directive.Block, String.Format("加载模版[{0}]失败!", name)); return ti; } #endregion if (String.Equals(directive.Name, "assembly", StringComparison.OrdinalIgnoreCase)) { String name = directive.GetParameter("name"); if (!AssemblyReferences.Contains(name)) AssemblyReferences.Add(name); } else if (String.Equals(directive.Name, "import", StringComparison.OrdinalIgnoreCase)) { item.Imports.Add(directive.GetParameter("namespace")); } else if (String.Equals(directive.Name, "template", StringComparison.OrdinalIgnoreCase)) { if (!item.Processed) { // 由模版指令指定类名 String name = directive.GetParameter("name"); if (!String.IsNullOrEmpty(name)) item.ClassName = name; //item.BaseClassName = directive.GetParameter("inherits"); if (directive.TryGetParameter("inherits", out name)) item.BaseClassName = name; item.Processed = true; } else throw new TemplateException(directive.Block, "多个模版指令!"); } else if (String.Equals(directive.Name, "var", StringComparison.OrdinalIgnoreCase)) { String name = directive.GetParameter("name"); String type = directive.GetParameter("type"); if (item.Vars.ContainsKey(name)) throw new TemplateException(directive.Block, "模版变量" + name + "已存在!"); Type ptype = TypeX.GetType(type, true); if (ptype == null) throw new TemplateException(directive.Block, "无法找到模版变量类型" + type + "!"); // 因为TypeX.GetType的强大,模版可能没有引用程序集和命名空间,甚至type位于未装载的程序集中它也会自动装载,所以这里需要加上 ImportType(item, ptype); item.Vars.Add(name, ptype); } return null; }
private TemplateItem ProcessDirective(Directive directive, TemplateItem item) { #region 包含include if (directive.Name.EqualIgnoreCase("include")) { var name = directive.GetParameter("name"); // 可能采用了相对路径 if (!File.Exists(name)) { name = Path.Combine(Path.GetDirectoryName(item.Name), name); } String content = null; var ti = FindTemplateItem(name); if (ti != null) { ti.Included = true; content = ti.Content; } else { // 尝试读取文件 if (File.Exists(name)) { ti = new TemplateItem(); ti.Name = name; ti.Content = File.ReadAllText(name); Templates.Add(ti); ti.Included = true; content = ti.Content; } } // 允许内容为空 //if (String.IsNullOrEmpty(content)) throw new TemplateException(directive.Block, String.Format("加载模版[{0}]失败!", name)); return(ti); } #endregion if (directive.Name.EqualIgnoreCase("assembly")) { var name = directive.GetParameter("name"); if (!AssemblyReferences.Contains(name)) { AssemblyReferences.Add(name); } } else if (directive.Name.EqualIgnoreCase("import")) { item.Imports.Add(directive.GetParameter("namespace")); } else if (directive.Name.EqualIgnoreCase("template")) { if (item.Processed) { throw new TemplateException(directive.Block, "多个模版指令!"); } // 由模版指令指定类名 var name = ""; if (directive.TryGetParameter("name", out name) && !String.IsNullOrEmpty(name)) { item.ClassName = name; } //item.BaseClassName = directive.GetParameter("inherits"); if (directive.TryGetParameter("inherits", out name)) { item.BaseClassName = name; } item.Processed = true; } else if (directive.Name.EqualIgnoreCase("var")) { var name = directive.GetParameter("name"); var type = directive.GetParameter("type"); if (item.Vars.ContainsKey(name)) { throw new TemplateException(directive.Block, "模版变量" + name + "已存在!"); } var ptype = type.GetTypeEx(); if (ptype == null) { throw new TemplateException(directive.Block, "无法找到模版变量类型" + type + "!"); } // 因为TypeX.GetType的强大,模版可能没有引用程序集和命名空间,甚至type位于未装载的程序集中它也会自动装载,所以这里需要加上 ImportType(item, ptype); item.Vars.Add(name, ptype); } return(null); }