使用CodeMemberMethod创建异步方法

时间:2014-10-29 18:27:28

标签: c# template-meta-programming codedom

如何使用async

来装饰CodeDom.CodeMemberMethod方法签名?

我希望得到结果:

public async Task SomeMethodAsync()
{     
}

CodeDom无法做到这一点。我最终使用了regex

 public static class GenCodeParser
 {
    private const string AsyncKeyWordPattern = @"(?<=public class DynamicClass(\r\n)*\s*{(\r\n)*\s*public)(?=.*\s*SomeMethodAsync{1})";
    private const string AsyncKeyWordReplacementPattern = @" async ";

    public static string AddAsyncKeyWordToMethodDeclaration(string sourceCode)
    {
        if (string.IsNullOrWhiteSpace(sourceCode)) return null;

        try
        {
            var regex = new Regex(AsyncKeyWordPattern);
            return regex.Replace(sourceCode, AsyncKeyWordReplacementPattern);
        }
        catch
        {
            return null;
        }
    }
} 

1 个答案:

答案 0 :(得分:3)

CodeDOM对async一无所知,因此没有直接的方法将其添加到您的方法中。但它对你写作的内容也很宽容。

因此,您可以做的是编写一个返回类型为async Task的方法。当然这不是一个有效的类型,但是如果你把那个字符串写到返回类型通常所在的位置,你就会得到想要的东西。

例如:

new CodeMemberMethod
    { Name = "M", ReturnType = new CodeTypeReference("async Task") }

编译成:

private async Task M() {
}