Func tipi bir değer gerektiren bir api ile çalışıyorum. (Özellikle, ModelMetadataProviders.Current.GetMetadataForType() ulaşmaya çalışıyorum.F # içinde bir Func <obj> türüyle nasıl bir ifade üretebilirim?
Ben F # bu değeri oluşturmak nasıl?
Func tipi bir değer gerektiren bir api ile çalışıyorum. (Özellikle, ModelMetadataProviders.Current.GetMetadataForType() ulaşmaya çalışıyorum.F # içinde bir Func <obj> türüyle nasıl bir ifade üretebilirim?
Ben F # bu değeri oluşturmak nasıl?
açıkça oluşturmak gerekmez Func
herhangi temsilci götüren bir yöntemi çağırmak delege, çünkü F #, lambda ifadelerini delege türüne (üye çağrılarında) dolaylı olarak dönüştürür. Sadece lamda işlevi ile yöntemini çağırarak çalışması gerektiğini düşünüyorum İşte
type Foo() =
member x.Bar(a:System.Func<obj>) = a.Invoke()
let f = Foo()
let rnd = f.Bar(fun() -> new Random() :> obj)
Ben böyle bir şey çalışması gerekir varsayalım: Eğer açık upcast (expr :> obj
) ihtiyaç
m.GetMetadataForType((fun() -> <expression> :> obj), modelType)
Not lambda fonksiyonu doğru türde (obj
) döndürür emin olmak için. Eğer lambda işlevini let
kullanarak yerel bir değere atamak istiyorsanız, o zaman işe yaramaz, çünkü örtük dönüştürme yalnızca bir argüman olarak doğrudan iletildiğinde çalışır. Ancak, bu durumda, kodu biraz daha güzel hale getirir.
let f = new System.Func<obj>(fun() -> printfn "ok"; new obj())
'Yeni' anahtar kelimesini de çıkarmayı başardım. –
Normalde herhangi () -> obj
geçirebilirsiniz ve otomatik Func<obj>
dönüştürülecektir. Sen gerekebilir sarmak için senin fun
Func<obj>
ile:
> let d : Func<obj> = Func<obj>(fun() -> box "hello");;
val d : Func<obj>
Örneğinizde "Bar" bir "Func" aldığından, ancak bir "Func " ifadesini geçtiğinizden bir yazım hatası olduğunu düşünüyorum. –
kvb
Kvb: Haklısın, yazım hatası düzeltildi, teşekkürler! –
Haklısınız. Teşekkürler Tomas. Benim durumumda, oyuncuya bile ihtiyacım yoktu. meta = m olsun: - meta = dönüştürmez m.GetMetadataForType (acc, t) , bu geçiş izin acc = let (> modeli (fun)): Benim asıl sorun bu yaptığımız oldu .GetMetadataForType ((fun() -> model), t) iyi çalıştı. –