c# - 如何获取 Q# 操作参数的类型?
问题描述
假设我们在 Q# 程序中有以下操作:
operation MyOperation (num : Int , qubit : Qubit) : Bool {
...
...
...
}
如果在同一命名空间中的另一个 C# 脚本中,我们有:
Assembly assembly = Assembly.GetExecutingAssembly ();
Type[] classes = assembly.GetTypes ();
foreach (var item in classes) {
Console.WriteLine ("Class : {0}", item.Name);
List<MethodInfo> methods = new List<MethodInfo> (item.GetMethods ());
foreach (var method in methods) {
// This array contains the parameters of EACH individual method
ParameterInfo[] p = method.GetParameters();
foreach (var param in p) {
// parameter manipulation
}
}
}
在内部,foreach (var param in p) { ... }
我们访问特定方法的每个参数。现在如果我们运行程序,输出将类似于:
Class : MyOperation
...
...
(其中的点指的是程序集中存在的其他类的信息,但在这个问题中并不重要。)正如所见,每个 Q# 操作都被视为一个类(这是有道理的),但我的问题是如何以获取MyOperation
未检索到的代码结果中的参数?
解决方案
要回答您的问题,每个 Q# 操作都会生成一个扩展通用类的 C# 类,因此要Operation<I,O>
找出输入/输出参数,您可以查看BaseType
操作的GenericTypeArguments[0]
输入类型;运行时在这里做类似的事情:https ://github.com/microsoft/qsharp-runtime/blob/0953d8b632705b9172918ce1588c73ed42088d11/src/Simulation/Core/Generics/GenericCallable.cs#L184
输入类型将是 a ValueTuple
,要识别单个参数的类型,您需要检查每个Fields
.
希望这一切都有意义。为什么需要这些信息?除了反射之外,还有其他/更好的方法可以做到这一点,您也许可以利用更高级别的 API,例如使用 IQ# 来做到这一点。
推荐阅读
- python - 如何将 ssd mobilenet v1 coco 对象检测转变为人类检测,只需过滤掉其他类而不进行重新训练?
- r - Formattable 在渲染特殊字体字符时出现问题
- python - Python - 检查是否有来自用户的输入而不停止循环
- c++ - 使用正则表达式搜索子序列 | C++
- java - 基于属性比较两个列表是否具有相同的元素
- php - PHP foreach 数组 - 保留键
- javascript - JS将base64图片转为图片文件
- python - 如何将单个日期与 Flask、SQLAlchemy、SQLite 进行比较
- dialogflow-es - 我想将对话框流自定义有效负载响应显示为可单击的文本按钮(即单击时它应该返回具有相同文本的消息,与芯片相同)
- django - 将多个图像库添加到带有文本的页面?