0

从 F#测试 NoRM https://github.com/atheken/NoRM并尝试找到一种使用它的好方法。这是基本的C#:

class products
{
    public ObjectId _id { get; set; }
    public string name { get; set; }
}

using (var c = Mongo.Create("mongodb://127.0.0.1:27017/test"))
{
    var col = c.GetCollection<products>();
    var res = col.Find();
    Console.WriteLine(res.Count().ToString());
}

这工作正常,但这是我从 F# 访问它的方式:

type products() = 
    inherit System.Object()

    let mutable id = new ObjectId()
    let mutable _name = ""

    member x._id with get() = id and set(v) = id <- v
    member x.name with get() = _name and set(v) = _name <- v

有没有更简单的方法来创建类或类型以传递给泛型方法?

这是它的名称:

use db = Mongo.Create("mongodb://127.0.0.1:27017/test")
let col = db.GetCollection<products>()
let count = col.Find() |> Seq.length
printfn "%d" count
4

3 回答 3

1

您是否尝试过记录类型?

type products = {
    mutable _id : ObjectId
    mutable name : string
    }

我不知道它是否有效,但是当您只需要一个基本上是“一组字段”的类时,记录通常很好。

于 2010-11-27T21:58:52.860 回答
1

出于好奇,您可以尝试向记录添加无参数构造函数。这绝对是一个 hack - 事实上,它使用了 F# 编译器中的一个错误 - 但它可能会起作用:

type Products = 
  { mutable _id : ObjectId
    mutable name : string }
  // Horrible hack: Add member that looks like constructor 
  member x.``.ctor``() = ()

member声明添加了一个用于构造函数的具有特殊 .NET 名称的成员,因此 .NET 认为它是一个构造函数。我会非常小心地使用它,但它可能适用于您的场景,因为该成员通过反射显示为构造函数。

如果这是获得与 MongoDB 等库一起使用的简洁类型声明的唯一方法,那么它将有希望地激励 F# 团队在该语言的未来版本中解决问题(例如,我可以很容易地想象一些特殊的属性会迫使 F#编译器添加无参数构造函数)。

于 2010-11-29T00:11:56.593 回答
0

这是定义接近 C# 定义的类的一种非常简单的方法:它有一个默认构造函数,但使用公共字段而不是 getter 和 setter,这可能是一个问题(我不知道)。

type products =
    val mutable _id: ObjectId
    val mutable name: string
    new() = {_id = ObjectId() ; name = ""}

或者,如果您可以为您的字段使用默认值(在这种情况下,全部为空):

type products() =
    [<DefaultValue>] val mutable _id: ObjectId
    [<DefaultValue>] val mutable name: string
于 2010-11-28T15:37:12.450 回答