如何获得Q#操作参数的类型?

问题描述 投票:0回答:1

假设我们在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参数,因为未检索到它们的代码结果如何?

c# .net q#
1个回答
1
投票

为了回答您的问题,每个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#)来执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.