Je voudrais écrire une fonction qui prend une fonction F comme argument et renvoie le système.reflection.methodinfo associé à f. p>
Je ne suis pas tout à fait sûr s'il est réalisable ou non. P>
4 Réponses :
Ce n'est pas (facilement) possible. La chose à noter est que lorsque vous écrivez:
printFunctionName (fun x -> x + 1) // Lambda expression printFunctionName String.ToUpper // Function value printFunctionName (List.map id) // Curried function printFunctionNAme (not >> List.empty) // Function composition
Cela aide peut-être, je sais que f est toujours une valeur de fonction. Que recommandez-vous? Je vais prendre n'importe quel hack ..
Je ne sais pas s'il existe une réponse générale pour tout type de fonction, mais si votre fonction est simple ('A ->' B), vous pouvez écrire P>
letmethodinfo (F: 'a ->' b) = (fastfunc.toconverter f) .Method code> p>
Quel est l'espace de noms de fastfunc
Le programme ci-dessous peut-il aider?
Ouais droit, à peu près comme ça, attendez-vous à ne pas connaître le nom de la méthode ("F") ou du module.
Donc, j'ai enfin trouvé une solution. Très hacky, mais hey! Ça marche! (Modifier: En mode de débogage uniquement).
method public strict virtual instance class [FSharp.Core]Microsoft.FSharp.Core.Unit Invoke(int32 sv, int32[] a, int32[] b, int32[] c, int32[] d) cil managed { // Code size 28 (0x1c) .maxstack 7 .locals init ([0] int32 V_0) IL_0000: nop IL_0001: ldarg.2 IL_0002: ldc.i4.2 IL_0003: ldelem [mscorlib]System.Int32 IL_0008: ldarg.3 IL_0009: ldc.i4.3 IL_000a: ldelem [mscorlib]System.Int32 IL_000f: add IL_0010: stloc.0 IL_0011: ldarg.s c IL_0013: ldc.i4.0 IL_0014: ldloc.0 IL_0015: stelem [mscorlib]System.Int32 IL_001a: ldnull IL_001b: ret } // end of method mb@25::Invoke
Si cela fonctionne pour vous, vous allez vouloir l'accepter comme la réponse.
Pourriez-vous donner un exemple d'utilisation? Je comprends l'idée générale de la solution, mais je ne vois pas pourquoi F a le type qu'il a.
Qu'est-ce que vous avez l'intention de faire avec la méthodeInfo?
J'essaie d'obtenir la définition réfléchie avec ERM
Je ne sais rien dans F # mais à O'Caml, vous pouvez le faire en utilisant le pré-processeur (je ne sais pas s'il y a quelque chose de similaire dans F #) groups.google.com/group/fa.caml/browse_thread/thread/.../a>