使用CodeDOM创建扩展方法

svi*_*ick 3 .net c# extension-methods codedom

我正在尝试使用CodeDOM创建扩展方法.似乎没有任何支持它们,并且ExtensionAttribute不允许使用(内部使用C#标记扩展方法).

可以使用技巧来指定this修饰符,但是如何创建包含类static,以便代码实际编译?

由于static是C#概念,因此不会通过CodeDOM API公开.并设置TypeAttributesTypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.Public不行的,因为

抽象类不能被密封或静态

如何使扩展方法编译?

use*_*116 7

我很确定你在寻找:

var staticClass = new CodeTypeDeclaration("Extensions")
    {
        Attributes = MemberAttributes.Public|MemberAttributes.Static
    };
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用.有趣的是:

provider.Supports(GeneratorSupport.StaticConstructors);
// True

provider.Supports(GeneratorSupport.PublicStaticMembers);
// True
Run Code Online (Sandbox Code Playgroud)

但是,然而,当你去输出它,即使Attributes属性显然从没有改变的变化0x000050020x00006003.

根据Microsoft Connect,这是不可能的:

感谢您报告此事.不幸的是,看起来我们不能支持CodeDom的静态类.

原因是CodeDom的设计目标之一是与语言无关,因此可以轻松地为不同的语言生成为一种语言生成的任何代码.虽然静态类经常在C#中使用,但VB不支持它们.因此,添加对静态类的支持意味着一些可以为C#编译的代码将无法编译为VB,这违背了我们的目标.

虽然我们无法就此问题采取行动,但我们请您继续提供反馈,以帮助我们改进.


肮脏的解决方法:

var type = new CodeTypeDeclaration("Extensions");
type.Attributes = MemberAttributes.Public;
type.StartDirectives.Add(
    new CodeRegionDirective(CodeRegionMode.Start, "\nstatic"));
type.EndDirectives.Add(
    new CodeRegionDirective(CodeRegionMode.End, String.Empty));
Run Code Online (Sandbox Code Playgroud)

生产:

#region
static
public class Extensions
{
}
#endregion
Run Code Online (Sandbox Code Playgroud)

哪个编译.