首页 > 解决方案 > 如何获取 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未检索到的代码结果中的参数?

标签: c#.netq#

解决方案


要回答您的问题,每个 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# 来做到这一点。


推荐阅读