如何在Azure Functions中共享扩展方法而无需嵌套类?

3
我知道如何通过 #load 包含其他的 .csx 文件。然而,扩展方法必须在顶级类中定义,而 #load 嵌套了这个类,所以它不是顶级的,函数会抛出编译错误。
我该如何使用共享代码而不使其嵌套在函数的后编译类中?
2个回答

4
为了正确地包含Azure Function的扩展方法,您可以像在所有其他情况下一样使用#load,唯一的区别是扩展方法需要在顶级类中使它们成为顶级方法 :)。当Azure Function编译csx文件的内容时,它会将其包装在一个自动创建的类中,这就是为什么它抱怨按照常规c#方式编写的扩展方法将嵌套在该自动创建的类中。
理解了这一点后,有一个简单的技巧可以将扩展方法放在单独的csx文件中,并且仍然在顶层类中定义它们:
这是run.csx文件。
#load "extensions.csx"

public static void Run(TimerInfo timer, TraceWriter log)
{
    log.Info("test".MyToUpperExtension());
}

以及 extensions.csx

static string MyToUpperExtension(this string str)
{
    return str.ToUpper();
}

static string MyToLowerExtension(this string str)
{
    return str.ToLower();
}

正如您所看到的,常规扩展方法和扩展属性的唯一区别在于您不需要自己将它们包装在静态类中。


当我读到这个时,我说:“如果这个能行,我就吃我的帽子。” 然后它真的起作用了。谢天谢地,我没有戴帽子。 - Deane
很高兴能帮助到你,而不会引起任何消化问题 ;) - Slawek

1
你可以选择在一个单独的C#类中创建扩展方法,并将其添加到函数中。
来自文档

如果您需要引用私有程序集,您可以将程序集文件上传到相对于函数的bin文件夹中,并使用文件名进行引用(例如 #r "MyAssembly.dll")。有关如何将文件上传到函数文件夹的信息,请参见以下有关包管理的部分。

.


我不想使用汇编语言。我只是在一个.csx文件中定义了一个静态类。我可以将其包含进来,但它无法编译,因为该类被嵌套了。 - Deane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接