如果要定义一些扩展方法,用F#编写的程序集中的属性,然后在C#中使用该程序集,您会在C#中看到已定义的扩展吗?
如果是这样,那就太酷了.
[] module Methods = [ ] let Exists(opt : string option) = match opt with | Some _ -> true | None -> false
只有通过将命名空间(使用using)添加到将使用它的文件中,才能在C#中使用此方法.
if (p2.Description.Exists()) { ...}
这是原始博客帖子的链接.
在评论"扩展静态方法"中回答问题:
namespace ExtensionFSharp module CollectionExtensions = type System.Linq.Enumerable with static member RangeChar(first:char, last:char) = {first .. last}
在F#中,您可以这样称呼它:
open System.Linq open ExtensionFSharp.CollectionExtensions let rangeChar = Enumerable.RangeChar('a', 'z') printfn "Contains %i items" rangeChar.CountItems
在C#中你这样称呼它:
using System; using System.Collections.Generic; using ExtensionFSharp; class Program { static void Main(string[] args) { var method = typeof (CollectionExtensions).GetMethod("Enumerable.RangeChar.2.static"); var rangeChar = (IEnumerable) method.Invoke(null, new object[] {'a', 'z'}); foreach (var c in rangeChar) { Console.WriteLine(c); } } }
现在,给我一个惊人的勋章!
尽管我的另一个答案是,我只是尝试使用F#CTP(在VS shell上)和C#Express从我家里的盒子(所有免费开发工具!),这样做:
F#
#light namespace MyFSharp // C# way [] module ExtensionMethods = [ ] let Great(s : System.String) = "Great" // F# way type System.String with member this.Awesome() = "Awesome" let example = "foo".Awesome()
C#
using System; using MyFSharp; // reference the F# dll class Program { static void Main(string[] args) { var s = "foo"; //s.Awesome(); // no Console.WriteLine(s.Great()); // yes } }
我不知道你能做到这一点; 俏皮.感谢@alex.
根据语言规范,第10.7节"类型扩展":
可选的扩展成员是静态成员的语法糖.可选扩展成员的使用精心调用具有编码名称的静态成员,其中对象作为第一个参数传递.此版本的F#中未指定名称编码,并且与C#扩展成员的C#编码不兼容