È possibile esporre qualsiasi valid F # nome della funzione di C# come qualsiasi C# nome di funzione valido utilizzando CompiledName attributo:
namespace Library1
module Test =
[<CompiledName("Whatever")>]
let ``add a and b`` x y = x + y
e poi in C#:
using Library1;
...............
System.Console.WriteLine(Test.Whatever(2,2));
FOLLOW-UP 03/05/2016 su commento da NickL, si applica almeno a F # 3.1:
Mo dalle funzioni ai membri porta alcuni "se e ma".
Per cominciare, l'attributo CompiledName
non viene compilato con member
se utilizzato da puro namespace
. La semplice compilazione richiede l'uso all'interno di uno module
.
quando viene utilizzato all'interno di un module
e decorare metodomember
di F # di registrazione funziona bene a prescindere di come i contenuti tra due zecche sembra. Tuttavia quando decorare proprietàmember
di F # record di CompiledName
è visibile cross-assemblaggio solo se contenuti tra doppie zecche assomiglia qualche nome valore legale:
module M
type MyRecord =
{ myField: string }
[<CompiledName "Whatever">]
member x.``Blah Blah blah``() = x.myField
[<CompiledName "Another">]
member x.``ABC`` = x.myField
e poi da C# le seguenti opere OK:
var recInC = new M.MyRecord("Testing...");
Console.WriteLine(recInC.Whatever());
Console.WriteLine(recInC.Another);
Tali incongruenze richiedono potenziali issues.
fonte
2013-10-12 00:03:47
Riflessione? Potrebbe essere l'unico modo. –
Grazie. Ci stavo pensando, ma renderà il codice più difficile da leggere. Penso che potrei semplicemente re-associare la funzione con il nome C# -friendly invece. – kimsk