在f#中,绑定到c#库中的值

时间:2012-02-21 21:26:34

标签: f# interop

我有一个F#DLL和一个C#DLL。

C#库的名称空间为Library,其中Toolbox类包含成员FUND_BITS,如下所示:

namespace Library {
    public static class Toolbox {
        public static uint FUND_BITS = 0;
    }
}

然后在F#库中我有一个绑定:

let bf = Library.Toolbox.FUND_BITS

现在,我在库中定义的几个函数中使用bf。当我更改FUND_BITS的值时,我希望所有F#函数都会使用更新后的值,因为我已绑定bf来引用Library.Toolbox.FUND_BITS,并且尚未声明它是一个可变的副本或任何东西。但是,我发现这些函数使用的是陈旧值FUND_BITS而不是更新后的值。

我是否误解了F#如何创建不可变的值绑定?如果是这样,我无法找到以更新方式绑定的方法,例如:

let bf = &Library.Toolbox.FUND_BITS

1 个答案:

答案 0 :(得分:5)

不幸的是,在这种情况下,“绑定”与用户界面数据绑定意义上的“绑定”不同。行let bf = Library.Toolbox.FUND_BITS基本上是一个简单的赋值语句。您会发现类型推断显示值bfuint32的实例。

如果要动态读取值,则需要使用每次调用时读取静态变量值的函数。

let bf = (function () -> Library.Toolbox.FUND_BITS)

编辑这个更简洁的版本归功于Guvante

let bf() = Library.Toobox.FUND_BITS

在这种情况下,bf的类型为unit -> uint32

如果你想在值之间建立双向链接,那么你可以声明一个使用静态字段作为后备存储的属性getter和setter,但这只会吓到我。更好的方法是在需要读取或写入时直接引用该字段。