c# - 有没有办法在 CodeDom 的另一个方法中生成本地方法?
问题描述
我正在使用 CodeDom 创建代码。但是,CodeDom 不支持 lambda 语句。所以我现在试图通过创建一个本地方法来模仿 lambda 语句,并将该方法作为参数传递给另一个方法。像这样:
public string MainMethod(string myParameter)
{
string g() { return instance.MainMethod(myParameter); }
return someOtherMethod(g);
}
使用 CodeDom 已经生成了方法“MainMethod”,我正在尝试在其中获取本地方法。但是,到目前为止,我找不到办法做到这一点。我可以使用一些帮助。
我已经尝试将 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 属性不允许这样做。有没有办法以另一种方式做到这一点?
解决方案
在 C# 版本 7 之前,本地函数不是受支持的语言结构。 CodeDOM 的设计要早得多,并且不涵盖所有 C# 功能,即使是当时的 C# 版本也是如此。换句话说,不幸的是,没有办法声明一个“本地方法”并将其添加到Statements
另一个方法的集合中。
相反,请考虑声明一个单独的private
方法。你的类的公共接口将不受影响,并且很可能你会实现你想要的。但是,不能隐式访问“外部方法”的参数。
另外,请考虑查看此答案以获取更多想法。
推荐阅读
- flutter - 分页数据表和提供者
- unity3d - 再次加载场景时,不会从我应用了单例模式的脚本中调用启动函数
- mysql - mysql查询表值确实改变了
- python - Python:通过其字典属性之一过滤自定义对象列表
- node.js - (node:9511) ExperimentalWarning: ESM 模块加载器是实验性的
- javascript - Javascript - addEventListener 按钮单击不起作用
- javascript - Javascript - 基于字符串执行函数
- python - 在递归函数输出中以不同方式返回变量和打印变量
- c# - 如何选择视频文件并通过 VideoLAN.LibVLC.UWP 播放
- python - Knative kafka 版本和 python 支持