Guest User

Untitled

a guest
Apr 21st, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. let ns = "MyNamespace"
  2. let asm = Assembly.GetExecutingAssembly()
  3.  
  4. let private newProperty t name getter isStatic = ProvidedProperty(name, t, getter, isStatic = isStatic)
  5. let private newStaticProperty t name getter = newProperty t name (fun _ -> getter) true
  6. let private newInstanceProperty t name getter = newProperty t name (fun _ -> getter) false
  7. let private addStaticProperty t name getter (``type``:ProvidedTypeDefinition) = ``type``.AddMember (newStaticProperty t name getter); ``type``
  8. let private addInstanceProperty t name getter (``type``:ProvidedTypeDefinition) = ``type``.AddMember (newInstanceProperty t name getter); ``type``
  9.  
  10. [<TypeProvider>]
  11. type TypeProvider(config : TypeProviderConfig) as this =
  12. inherit TypeProviderForNamespaces(config)
  13.  
  14. let provider = ProvidedTypeDefinition(asm, ns, "Provider", Some typeof<obj>, hideObjectMethods = true)
  15. let tags = ProvidedTypeDefinition(asm, ns, "Tags", Some typeof<obj>, hideObjectMethods = true)
  16. do [1..2000] |> Seq.iter (fun i -> addInstanceProperty typeof<int> (sprintf "Tag%d" i) <@@ i @@> tags |> ignore)
  17.  
  18. do provider.DefineStaticParameters([ProvidedStaticParameter("Host", typeof<string>)], fun name args ->
  19. let provided = ProvidedTypeDefinition(asm, ns, name, Some typeof<obj>, hideObjectMethods = true)
  20. addStaticProperty tags "Tags" <@@ obj() @@> provided |> ignore
  21. provided
  22. )
  23.  
  24. do this.AddNamespace(ns, [provider; tags])
  25.  
  26. module Common
  27. open MyNamespace
  28.  
  29. type Provided = Provider<"">
  30. let providedTags = Provided.Tags
  31.  
  32. type LocalTags() =
  33. member this.Tag1 with get() : int = 1
  34. member this.Tag2 with get() : int = 2
  35. .
  36. .
  37. member this.Tag1999 with get() : int = 1999
  38. member this.Tag2000 with get() : int = 2000
  39.  
  40. let localTags = LocalTags()
  41.  
  42. module Tests
  43.  
  44. open Common
  45. open Xunit
  46.  
  47. [<Fact>]
  48. let ProvidedTagsTest () =
  49. Assert.Equal<int>(providedTags.Tag1001, 1001)
  50.  
  51. [<Fact>]
  52. let LocalTagsTest () =
  53. Assert.Equal<int>(localTags.Tag100, 100)
Add Comment
Please, Sign In to add comment