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
arasındaki fark nedir :> ve:?> operatör? –
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
":>" 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