【问题标题】:Generate Extension Methods using System.CodeDom使用 System.CodeDom 生成扩展方法
【发布时间】:2011-08-26 01:24:40
【问题描述】:

有没有人尝试过在 .NET 4.0 下使用 System.CodeDom 生成扩展方法?似乎没有任何方法可以将 CodeMemberMethod 或 CodeParameterDeclarationExpression 指定为扩展方法/参数。

如果这不可能,有什么好的解决方法吗?

谢谢

【问题讨论】:

    标签: c# extension-methods codedom system-codedom-compiler


    【解决方案1】:

    Extension Attribute

    引用:

    在 Visual Basic 中,您应该使用此属性来创建扩展方法。有关详细信息,请参阅扩展方法 (Visual Basic)。

    在 C# 中,您不需要使用此属性;您应该对第一个参数使用 this(C# 参考)修饰符来创建扩展方法。编译器会自动为扩展方法发出 ExtensionAttribute。有关详细信息,请参阅扩展方法(C# 编程指南)。

    如果您正在编写支持扩展方法的编译器,您的编译器应该在每个扩展方法以及包含一个或多个扩展方法的每个类和程序集上发出此属性。

    【讨论】:

    • 它只会将 ExtensionAttribute 应用于方法,这在 C# 中是一个错误...编译器说要改用 this 修饰符
    • 你是想使用编译器,还是反射发射?如果您指的是某种 in-IDE 脚本/插件,我可能误解了您的问题;也就是说,你可能会考虑使用Compiler As A Service,无论如何
    • 我正在使用 System.CodeDom,这是一个包含在标准 .NET 框架中的库,用于生成代码文件(或程序集)。
    【解决方案2】:

    显然 CodeDom 无法为扩展方法的第一个参数生成正确的代码,但你可以这样作弊:

    var param = new CodeParameterDeclarationExpression("this string", "s");
    

    它会很高兴地忽略“这个字符串”不是有效类型的事实......

    【讨论】:

    • 这实际上非常适合我的需求。我出于语法原因使用扩展方法,仅此而已,因此不会访问“this”参数上的任何成员,因此我什至不必担心 System.CodeDom 中的任何类型检查...感谢您的想法
    猜你喜欢
    • 2019-08-29
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    相关资源
    最近更新 更多