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>