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)) + ">";
}
}
}