的空单,说typeof<string>
,在运行时如何创建一个的string list = []
等价?如何创建给定的.NET类型的特定运行时类型
我的动机是,当使用FSharpValue.MakeRecord
创建基于解析值的记录时,需要将值作为obj[]
传递。我一直在使用box
来投射参数,除了使用列表之外,它已经起作用了。我遇到的问题是空的无类型列表不能装箱,然后拆箱。返回特定的错误是:
System.InvalidCastException: Unable to cast object of type
'Microsoft.FSharp.Collections.FSharpList`1[System.Object]'
to type
'Microsoft.FSharp.Collections.FSharpList`1[System.String]'.
空类型化的列表可以装箱拆箱,所以我一直试图找到一种方法来投下列表到运行时类型,例如typeof <>返回的类型,但没有运气。
type Test = {Names : string list}
// fails
let genericList = []
{Names = unbox (box genericList)}
//works
let typedList : string list = []
{Names = unbox (box typedList)}
//works
let genericNonEmptyList = ["Bill"]
{Names = unbox (box genericNonEmptyList)}
这可以通过使用反射来完成。但是在总体上表示,你应该重新考虑你的设计 –
难道Seq.cast你想要做什么?对不起,如果我误解了OP:'genericList |> Seq.cast'。 –
s952163
约翰,任何线索如何用反射做到这一点?我已经“哼了一声”,但是据我所知,没有明确的方法可以做到这一点。 – jbeeko