假设我们在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#操作都会生成一个扩展通用类Operation<I,O>
的C#类,因此要弄清楚什么输入/输出参数,您可以看一下该操作的BaseType
,然后看一下用GenericTypeArguments[0]
的值确定输入类型;运行时在这里做类似的事情:https://github.com/microsoft/qsharp-runtime/blob/0953d8b632705b9172918ce1588c73ed42088d11/src/Simulation/Core/Generics/GenericCallable.cs#L184
输入类型将是ValueTuple
,要确定各个参数的类型,您需要检查每个Fields
的类型。
希望这很有道理。为什么需要此信息?除了反射之外,还有其他/更好的方法可以执行此操作,您也许可以利用更高级别的API(例如,使用IQ#)来执行此操作。