using NCC.Dependency; using NCC.Reflection; using Microsoft.CodeAnalysis; using System; using System.Linq; using System.Reflection; namespace NCC.ViewEngine { /// /// 视图编译构建器 /// [SuppressSniffer] public class ViewEngineOptionsBuilder : IViewEngineOptionsBuilder { /// /// 视图编译选项 /// public ViewEngineOptions Options { get; set; } /// /// 构造函数 /// /// public ViewEngineOptionsBuilder(ViewEngineOptions options = null) { Options = options ?? new ViewEngineOptions(); } /// /// 添加程序集引用 /// /// public void AddAssemblyReferenceByName(string assemblyName) { var assembly = Reflect.GetAssembly(assemblyName); AddAssemblyReference(assembly); } /// /// 添加程序集引用 /// /// public void AddAssemblyReference(Assembly assembly) { Options.ReferencedAssemblies.Add(assembly); } /// /// 添加程序集引用 /// /// public void AddAssemblyReference(Type type) { AddAssemblyReference(type.Assembly); foreach (var argumentType in type.GenericTypeArguments) { AddAssemblyReference(argumentType); } } /// /// 添加元数据引用 /// /// public void AddMetadataReference(MetadataReference reference) { Options.MetadataReferences.Add(reference); } /// /// 添加 Using /// /// public void AddUsing(string namespaceName) { Options.DefaultUsings.Add(namespaceName); } /// /// 添加继承类型 /// /// public void Inherits(Type type) { Options.Inherits = RenderTypeName(type); AddAssemblyReference(type); } /// /// 渲染类型名 /// /// /// private string RenderTypeName(Type type) { var result = type.Namespace + "." + type.Name; if (result.Contains('`')) { result = result.Substring(0, result.IndexOf("`")); } if (type.GenericTypeArguments.Length == 0) { return result; } return result + "<" + string.Join(",", type.GenericTypeArguments.Select(RenderTypeName)) + ">"; } } }