gpt4 book ai didi

升级到 Razor 2/RE 3.2 后,RazorEngine 扩展方法因 RuntimeBinderException 而失败

转载 作者:行者123 更新时间:2023-12-02 05:16:27 25 4
gpt4 key购买 nike

我有一个 RazorEngine升级到 Razor 2.0 和 RazorEngine 3.2.0 后失败的项目

这在之前基于 Razor 1.0 的 RazorEngine (3.0.8) 版本中运行良好。

我有一个类 (MyClass) 的实例 (myInstance) 和扩展方法:

namespace MyCompany.Extensions 
{
public static class MyClassExtensions
{
public static string ExtensionMethod(this MyClass thing)
{
// do stuff
}
}
}

我想在 RazorEngine View 中调用它(简化示例,有很多这些方法,但都以相同的方式失败):

@using MyCompany.Extensions
@using MyCompany
@{
var myInstance = new MyClass(Model, ...);
}

Some text @myInstance.ExtensionMethod() some more text

这是在由 RazorEngine 编译的文本文件中:

string parsedResult = RE::Razor.Parse(fileContent, myModel, "testfile.txt");

问题是这一行(曾经有效)抛出一个RuntimeBinderException:

'MyCompany.MyClass' does not contain a definition for 'ExtensionMethod'

请注意,如果我将文本文件更改为:

Some text @MyClassExtensions.ExtensionMethod(myInstance) some more text

它工作正常,所以我认为它必须找到扩展方法的命名空间。

我的第一个想法是,它必须将传递的模型视为 dynamic(因此从它派生的任何东西也都是 dynamic),但它知道预期的类型在 RuntimeBinderException 中。由于异常是运行时的,我认为它一定是在编译模板时无法识别扩展方法,但为什么会发生变化?

我不确定 3.0.8 和 3.2.0 之间发生了什么变化,或者为什么它被破坏了。是否需要添加一些内容以便在编译模板时可以找到扩展方法?

最佳答案

这是一个 bug in RazorEngine : Razor.CompileTemplateBase<dynamic> 上工作(因此 Model 以及从它派生的所有内容也是 dynamic),这意味着没有扩展方法经过“编译器魔术”将它们转换为静态调用。然后 Razor.Run通过 Model作为正确的类型,但扩展方法语法被称为实例方法。

可能很快就会对此进行修复(该错误仅存在几天,这是一个极端情况),但与此同时我有一个解决方法:明确键入 Model在 Razor 模板中

@using MyCompany.Extensions
@using MyCompany
@{
ExpectedModelClass strongTypeModel = Model as ExpectedModelClass;
MyClass myInstance = new MyClass(strongTypeModel , ...);
}

Some text @myInstance.ExtensionMethod() some more text

这现在可以工作了,因为即使 Model还是dynamic在编译时不会传播到 myInstance没有了。

这并不理想,而且我到处都使用 Model现在必须是 strongTypeModel ,但这是一个更简单的替代。

关于升级到 Razor 2/RE 3.2 后,RazorEngine 扩展方法因 RuntimeBinderException 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14561695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com