我写了一个ip计算器库mixin功能和oop风格。
type IpAddr(file: string, loc: string) =
let location = queryIpLocation file loc
let listRange = extractAddr location
member self.Calculate(addr :string) =
validIp addr listRange
calculate方法返回记录类型:
type IpLoc =
{ ip : String
subnet : String
gateway : String }
然后我将库导入C#应用程序并想要使用类:
class Program
{
static void Main(string[] args)
{
var calc = new IpAddr(@"C:\Temp\file.xml", "xxxxxxx");
var ip = calc.Calculate("xxx.xxx.xxx.xxx");
Console.WriteLine(ip);
Console.ReadLine();
}
}
calculate方法返回类型为IpLoc的选项对象。现在我不知道如何在C#中处理选项对象。
我的目标是,在f#和gui wpf中为我的公司编写.net应用程序库,基于C#。为什么不只在C#中, 因为我想发现f#的强大功能,但这样做是个好主意吗?
答案 0 :(得分:2)
首先,我认为使用F#编写进行计算的库然后将其包装在可以从WPF应用程序中使用的C#友好API中是一个好主意。
我认为问题是Calculate
的结果是option<IpLoc>
。
通常,您可以找到一些处理来自C#的选项值的方法。这不是太难(如果你是唯一一个编写代码的人,可能是一个很好的选择)。但是,C#通常不会使用选项,所以你也可以将代码包装成惯用的C#。
您可以使用Unchecked.defaultof
返回null
。从F#的角度来看,这很危险,但有时它是C#代码所期望的:
member x.Calculate(b) =
match valueIp b with
| Some v -> v
| None -> Unchecked.defaultof<_>
另一种选择是创建一个返回bool
的方法,并通过out
参数返回该值。这类似于Int32.TryParse
的工作方式:
member x.Calculate(b, [<System.Runtime.InteropServices.Out>] ipLoc:byref<_>) =
match valueIp b with
| Some v -> ipLoc <- v; true
| None -> false
答案 1 :(得分:0)
如果您希望F#库与其他.NET语言交互,请查看此文档: "Guidelines for Libraries for Use from other .NET Languages"