2009-03-12 9 views
2

F # ile yansıtma yapıyorum ve Yansıma, F # içinden dinamik olarak bir Kayıt türü nesnesi oluşturmaya çalışıyorum, çalışmamın çoğunu (aşağıda görebileceğiniz gibi) aldım ama bir şey - Yansımayla yarattığım kayıt, onun yerine ("Kişi") yazdığı "obj" tipine sahip ve hiçbir şekilde onu takip edemiyorum.Yayımlama F # kaydı oluşturulma yansımasıyla oluşturuldu

#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 

cevap

2

Yani changeName (eğer başka bir şekilde bu kez yayın yaptığınızdan gibi) diğer dökme operatörü kullanmayı deneyin (yansıyan :?> Person) "Jack"

+0

arasındaki fark nedir :> ve:?> operatör? –

+0

En iyi açıklama muhtemelen burada: http://stuff.mit.edu/afs/athena/software/fsharp_v1.1.12/FSharp-1.1.12.3/manual/import-interop.html#Upcasts Ancak temel bilgiler Eğer bir sınıftan ebeveynine (yani obj'e) giderseniz:>. Ama eğer başka bir yolla gidiyorsanız:?> ... – Massif

+2

":>" bir ana yazıya bir nesneyi dönüştürmek için bir upcast, - her zaman güvenli ve upcasting hataları derleyici tarafından yakalanabilir. ":?>" bir downcast, bir nesneyi bir türden bir türeve dönüştürür - downcast'ler hiçbir zaman çalışma zamanı istisnalarına neden olduğundan, downcast'ler hiçbir zaman güvenli değildir. – Juliet