有没有一种方法可以在CodeDom的另一个方法中生成本地方法?

时间:2018-12-19 21:29:08

标签: c# .net lambda codedom

我正在使用CodeDom创建代码。但是,CodeDom不支持lambda语句。因此,我现在尝试通过创建本地方法来模仿lambda语句,并将该方法作为参数传递给另一个方法。像这样:

public string MainMethod(string myParameter)
{
    string g() { return instance.MainMethod(myParameter); }
    return someOtherMethod(g);
}

方法'MainMethod'已经通过使用CodeDom生成 我正在尝试在那里获取本地方法。但是,到目前为止,我还没有找到一种方法来做到这一点。我可以为此提供一些帮助。

我已经尝试将CodeMemberMethod添加到CodeMemberMethod,但是似乎没有办法。我似乎找不到其他选择。

当前,我的CodeDom代码使用MethodInfo作为基础:

var method = new CodeMemberMethod();
method.Name = methodInfo.Name;
method.ReturnType = new CodeTypeReference(methodInfo.ReturnType);

//left out parameter stuff

var gMethod = new CodeMemberMethod() { Name = "g", ReturnType = new CodeTypeReference(methodInfo.ReturnType) };
gMethod.Statements.Add(new CodeMethodReturnStatement(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeVariableReferenceExpression("instance"), methodInfo.Name), parameterReferences.ToArray())));
method.Statements.Add(gMethod);

现在,痛苦就在最后一个陈述中。我实际上是在尝试将CodeMemberMethod添加到CodeMemberMethod中,这是通过Statements属性不允许的。有没有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

Local functions直到C#版本7才被支持。DOM是较早设计的,并且不包括所有C#功能,甚至不包括当时的C#版本。换句话说,不幸的是,没有办法声明“本地方法”并将其添加到另一个方法的Statements集合中。

请考虑声明一个单独的private方法。班级的公共界面将保持不变,并且很可能会实现您想要的目标。但是,将无法隐式访问“外部方法”的参数。

另外,请考虑查看this answer以获得进一步的想法。

相关问题