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

RazorEngine扩展方法在升级到Razor 2/RE 3.2后因RuntimeBinderException而失败,razor,extension-methods,razor-2,Razor,Extension Methods,Razor 2,我有一个项目在升级到Razor2.0和Razorengine3.2.0后失败了 这在以前基于Razor1.0的RazorEngine版本(3.0.8)中运行良好 我有一个类(MyClass)的实例(myInstance)和扩展方法: namespace MyCompany.Extensions { public static class MyClassExtensions { public static string ExtensionMethod(this M

我有一个项目在升级到Razor2.0和Razorengine3.2.0后失败了

这在以前基于Razor1.0的RazorEngine版本(3.0.8)中运行良好

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

namespace MyCompany.Extensions 
{
    public static class MyClassExtensions
    {
        public static string ExtensionMethod(this MyClass thing) 
        {
            // do stuff
        }
    }
}
我想在RazorEngine视图中调用它(简化的示例,有很多这样的方法,并且都以相同的方式失败):

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

string parsedResult = RE::Razor.Parse(fileContent, myModel, "testfile.txt");
问题是这一行(用于工作)抛出了一个
RuntimeBinderException

“MyCompany.MyClass”不包含“ExtensionMethod”的定义

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

Some text @MyClassExtensions.ExtensionMethod(myInstance) some more text
它工作得很好,所以我认为它必须找到扩展方法的名称空间

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

我不知道3.0.8和3.2.0之间发生了什么变化,也不知道为什么会出现这种情况。是否需要添加一些内容,以便在编译模板时可以找到扩展方法?

这是一个:
Razor.Compile
TemplateBase
上工作(因此
Model
以及从中派生的所有内容都是
动态的
)这意味着没有任何扩展方法经过“编译器魔法”将它们转换为静态调用。然后
Razor.Run
Model
作为正确的类型传递,但是扩展方法语法被称为实例方法

可能很快就会有一个解决方案(这个bug只出现了几天,这是一个极端情况),但同时我有一个解决办法:在Razor模板中显式地键入
模型

这现在起作用了,因为即使
Model
在编译时仍然是
dynamic
,不再扩展到
myInstance


它并不理想,我使用的
Model
现在必须是
strongTypeModel
,但这是一个简单得多的替代方法。

它使用静态方法语法吗?例如
一些text@MyClassExtensions.ExtensionMethod(myInstance)更多的text
@nemesv yes
@MyClassExtensions.ExtensionMethod(myInstance)
工作正常,但是Razor代码中有数百种扩展方法(返回显示文本的任何内容都保存在核心库中).我用RazorEngine 3.2.0在一个空的控制台应用程序中复制了你的所有代码。而且效果很好。。。你能尝试在新项目中重新设置你的问题吗?@nemesv我还没有尝试过控制台应用程序,但其他空的MVC 4应用程序也有同样的症状。我需要在MVC应用程序中工作。这似乎是同一个问题,因为我还没有机会查看问题的根源,但我今晚会尽力为您解决。
Some text @MyClassExtensions.ExtensionMethod(myInstance) some more text
@using MyCompany.Extensions
@using MyCompany
@{
    ExpectedModelClass strongTypeModel = Model as ExpectedModelClass;
    MyClass myInstance = new MyClass(strongTypeModel , ...);
}

Some text @myInstance.ExtensionMethod() some more text