11
votes

Récupérer la méthodeInfo d'une fonction F #

Je voudrais écrire une fonction qui prend une fonction F comme argument et renvoie le système.reflection.methodinfo associé à f.

Je ne suis pas tout à fait sûr s'il est réalisable ou non.


3 commentaires

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>


4 Réponses :


2
votes

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


1 commentaires

Cela aide peut-être, je sais que f est toujours une valeur de fonction. Que recommandez-vous? Je vais prendre n'importe quel hack ..



2
votes

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

letmethodinfo (F: 'a ->' b) = (fastfunc.toconverter f) .Method


1 commentaires

Quel est l'espace de noms de fastfunc



3
votes

Le programme ci-dessous peut-il aider? XXX


1 commentaires

Ouais droit, à peu près comme ça, attendez-vous à ne pas connaître le nom de la méthode ("F") ou du module.



5
votes

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


2 commentaires

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.