2016-10-26 10 views
5

Tipi Sağlayıcıları aracılığıyla Jenerik Türleri Yaratmak

[<TypeProvider>] 
type SampleTypeProvider(config: TypeProviderConfig) as this = 

... 
//the below would be the generated type 
type A<'b>() = 
    member this.C() : 'b = ... 
    member this.D() : 'b = ... 
// 
... 
[<assembly:TypeProviderAssembly>] 
do() 
    .... 

böylece kullanım senaryosunda

#r @".\bin\Debug\SampleTypeProvider.dll" 
type A = SampleTypeProvider.A 
type intA = A<int> 
type strA = A<str> 

bir şey olmazdı böylece mümkün tip sağlayıcıları üzerinden genel bir tür oluşturmak için mi Ve bu ise mümkün - Nasıl yaklaşabilirim.

cevap

4

Bu, standart yöntemler kullanılarak mümkün değildir. Etrafa bakmayı denedim, ancak kanonik bir referans bulamadı, ancak bilinen bir sınırlama ve kısıtlamayı kaldırmak için çeşitli öneriler var.

Ross McKinlay, tür sağlayıcı çalıştırıldığında aslında F # kaynak koduyla bir dosya oluşturarak çalışan ve bu dosyayı projenize dahil edebileceğiniz Mixin type provider adlı biraz aşırı bir projeye sahiptir. Bu, belki de tür sağlayıcıdan daha fazla kod neslidir, ancak talk about the topic da bazı sınırlamaların iyi bir açıklamasıdır.

Bu sorunu nasıl ele alırsak, yazıcının hizmet sağlayıcısının amacına bağlıdır. Yalnızca sınırlı sayıda türe ihtiyacınız varsa, statik parametreler gibi bir şey kullanabilir ve A<"int"> veya A<"string"> yazabilirsiniz. Ayrıca, jenerik olmayan normal türlerle normal olarak temin edilemeyen jenerik türleri de karıştırabilirsiniz (bazı zekice bir şekilde). Ama daha iyi bir cevap almak için somut kullanım durumunuz hakkında daha fazla yazmanız gerektiğini düşünüyorum.

+0

iç çekmece. Verdiğin bir cevap beklediğimi umuyordum. – robkuz