首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Compilation.Emit(.)使用构造函数参数创建typeOf(T)

Compilation.Emit(.)使用构造函数参数创建typeOf(T)
EN

Stack Overflow用户
提问于 2018-03-13 16:46:58
回答 1查看 64关注 0票数 0

我正在使用RazorEngine进行Razor模板解析,并试图使用它的Roslyn代码。

我知道我的问题是在我的剃须刀视图中使用一个基类型(ViewBase<t>),并且它没有被构造(因为它有一个ctor参数)。

然而,在大量搜索之后,我找不到一种方法来告诉Emit()如何创建我类型的实例。

下面是它使用的代码--源代码生成很好,下面包含了一个省略的版本。

是否有某种类型的工厂,我可以提供,在其中可以用来生成这种类型?

当我调用emit时,我得到了错误There is no argument given that corresponds to the required formal parameter 'componentContext' of 'ViewBase<MyModelType>.ViewBase(IComponentContext)' --那么如何告诉emit()如何创建ViewBase<T>类型的实例

创建一个空的CTOR很好--但不是我所需要的。

代码语言:javascript
复制
public override Tuple<Type, CompilationData> CompileType(TypeContext context)
        {
            var sourceCode = GetCodeCompileUnit(context);
            var assemblyName = GetAssemblyName(context);

            (new PermissionSet(PermissionState.Unrestricted)).Assert();
            var tempDir = GetTemporaryDirectory();

            var sourceCodeFile = Path.Combine(tempDir, String.Format("{0}.{1}", assemblyName, SourceFileExtension));
            File.WriteAllText(sourceCodeFile, sourceCode);

            var references = GetAllReferences(context);

            var compilation =
                GetEmptyCompilation(assemblyName)
                    .AddSyntaxTrees(
                        GetSyntaxTree(sourceCode, sourceCodeFile))
                    .AddReferences(GetMetadataReferences(references));

            compilation =
                compilation
                    .WithOptions(
                        CreateOptions(context)
                            .WithOutputKind(OutputKind.DynamicallyLinkedLibrary)
                            .WithPlatform(Platform.AnyCpu)
                            .WithSourceReferenceResolver(new RazorEngineSourceReferenceResolver(sourceCodeFile)));

            var assemblyFile = Path.Combine(tempDir, String.Format("{0}.dll", assemblyName));

            var assemblyPdbFile = Path.Combine(tempDir, String.Format("{0}.pdb", assemblyName));
            var compilationData = new CompilationData(sourceCode, tempDir);

            using (var assemblyStream = File.Open(assemblyFile, FileMode.Create, FileAccess.ReadWrite))
            using (var pdbStream = File.Open(assemblyPdbFile, FileMode.Create, FileAccess.ReadWrite))
            {
                var opts = new EmitOptions()
                    .WithPdbFilePath(assemblyPdbFile);
                var pdbStreamHelper = pdbStream;

                if (IsMono())
                {
                    opts = opts.WithDebugInformationFormat(DebugInformationFormat.PortablePdb);
                }

                var result = compilation.Emit(assemblyStream, pdbStreamHelper, options: opts);

            }
        }

生成的视图代码

代码语言:javascript
复制
namespace CompiledRazorTemplates.Dynamic
{

#line default
#line hidden
    ;
    using System;
    //my load of other using statements...

    public class RazorEngine_99d043dd3e3d4c3ca787d42dd7a0bb6b : ViewBase<MyModelType>
    {
        #line hidden
        public RazorEngine_99d043dd3e3d4c3ca787d42dd7a0bb6b()
        {
        }

        #pragma warning disable 1998
        public override async Task Execute()
        {
..... OMITTED
        }
    }
}


public ViewBase(IComponentContext componentContext)
{
    Contract.Requires(componentContext != null);

    _componentContext = componentContext;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-13 16:57:26

你问的是Razor编译器,而不是Roslyn编译。

我不认为有什么办法可以做到。

但是,您可以使用一个Roslyn CSharpSyntaxRewriter来查找SyntaxTree中的现有构造函数,并重写它以拥有&传递一个参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49261589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档