Domanda

Ho fatto un casino con F # ed è Reflection, provando a creare un oggetto di tipo Record dinamicamente da F #, ho fatto funzionare gran parte di esso (come puoi vedere sotto) ma una cosa: il record che creo tramite reflection ha tipo " obj " invece quello che dovrebbe (" Person ") e non riesco ad essere in grado di eseguirne l'upgrade in alcun modo.

#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
È stato utile?

Soluzione

Prova a utilizzare l'altro operatore di trasmissione (poiché questa volta esegui la trasmissione nell'altro modo)

Quindi changeName (riflesso :? > Persona) " Jack "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top