向上转换通过反射创建的 F# 记录

发布于 2024-07-15 20:11:38 字数 1345 浏览 3 评论 0原文

我一直在搞乱 F# 和它的反射,试图从 F# 中动态创建一个 Record 类型对象,我让它的大部分工作正常(如下所示),但有一件事 - 我通过反射创建的记录具有类型“ obj”而不是它应该的(“人”),我似乎无法以任何方式升级它。

#light

type Person = {
    Name:string;
    Age:int;
}

let example = {Name = "Fredrik"; Age = 23;}
// example has type Person = {Name = "Fredrik"; Age = 23;}

let creator = Reflection.FSharpValue.PrecomputeRecordConstructor(example.GetType(), 
               System.Reflection.BindingFlags.Public)

let reflected = creator [| ("thr" :> obj); (23 :> obj) |]
// here reflected will have the type obj = {Name = "thr"; Age = 23;}

// Function that changes the name of a Person record
let changeName (x:Person) (name:string) = 
    { x with Name = name }

// Works with "example" which is has type "Person"
changeName example "Johan"

// But not with "reflected" since it has type "obj"
changeName reflected "Jack" // Error "This expression has type obj but is here used with type Person. "

// But casting reflected to Person doesn't work either
(reflected :> Person) // Type constraint mismatch. The type   obj is not compatible with 
                      // type  Person. The type 'obj' is not compatible with the type 'Person'. 
                      // C:\Users\thr\Documents\Visual Studio 2008\Projects\
                      // Reflection\Reflection\Script.fsx   34  2   Reflection

I've been messing about with F# and it's Reflection, trying to create a Record type object dynamically from within F#, I got most of it working (as you can see below) but one thing - the record I create through reflection has type "obj" instead the one it should ("Person") and I can't seem to be able to upcast it in any way.

#light

type Person = {
    Name:string;
    Age:int;
}

let example = {Name = "Fredrik"; Age = 23;}
// example has type Person = {Name = "Fredrik"; Age = 23;}

let creator = Reflection.FSharpValue.PrecomputeRecordConstructor(example.GetType(), 
               System.Reflection.BindingFlags.Public)

let reflected = creator [| ("thr" :> obj); (23 :> obj) |]
// here reflected will have the type obj = {Name = "thr"; Age = 23;}

// Function that changes the name of a Person record
let changeName (x:Person) (name:string) = 
    { x with Name = name }

// Works with "example" which is has type "Person"
changeName example "Johan"

// But not with "reflected" since it has type "obj"
changeName reflected "Jack" // Error "This expression has type obj but is here used with type Person. "

// But casting reflected to Person doesn't work either
(reflected :> Person) // Type constraint mismatch. The type   obj is not compatible with 
                      // type  Person. The type 'obj' is not compatible with the type 'Person'. 
                      // C:\Users\thr\Documents\Visual Studio 2008\Projects\
                      // Reflection\Reflection\Script.fsx   34  2   Reflection

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦年海沫深 2024-07-22 20:11:38

尝试使用其他强制转换运算符(因为这次您以另一种方式强制转换)

所以changeName(反映:?> Person)“Jack”

Try using the other cast operator (as you're casting the other way this time)

So changeName (reflected :?> Person) "Jack"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文