में मॉड्यूल का प्रकार कैसे प्राप्त करें मॉड्यूल के 'सिस्टम टाइप' कैसे प्राप्त करें?F #
उदाहरण मॉड्यूल के लिए:
module Foo =
let bar = 1
और यह काम नहीं करता है:
printfn "%s" typeof<Foo>.Name
त्रुटि है:
The type 'Foo' is not defined
में मॉड्यूल का प्रकार कैसे प्राप्त करें मॉड्यूल के 'सिस्टम टाइप' कैसे प्राप्त करें?F #
उदाहरण मॉड्यूल के लिए:
module Foo =
let bar = 1
और यह काम नहीं करता है:
printfn "%s" typeof<Foo>.Name
त्रुटि है:
The type 'Foo' is not defined
यह निश्चित रूप से एक moduleof
ऑपरेटर के लिए अच्छा होगा .. चूंकि कोई नहीं है, इसलिए आप जो चाहते हैं उसे करने का सबसे आसान तरीका शायद मेटाडाटा लाइब्रेरी का उपयोग करना है एफ # पॉवर में:
#r "FSharp.PowerPack.Metadata.dll"
open Microsoft.FSharp.Metadata
// get .NET assembly by filename or other means
let asm = ...
let fasm = FSharpAssembly.FromAssembly asm
let t = fasm.GetEntity("Foo").ReflectionType
दुर्भाग्य से, यह (जैसे एफ # इंटरएक्टिव द्वारा उत्पन्न होते हैं) को गतिशील विधानसभाओं के साथ काम नहीं करेगा। आप वेनिला System.Reflection
कॉल का उपयोग करके कुछ ऐसा कर सकते हैं, लेकिन यह आपके मॉड्यूल द्वारा संकलित संकलित रूप की अच्छी समझ रखने पर अधिक निर्भर है।
मुख्य समस्या यह है कि 'FSharpAssembly.FromAssembly asm' सभी प्रकारों को लोड करता है। टाइप सुरक्षा भी कम करें। –
@ माइक - मुझे यकीन नहीं है कि "टाइप प्रकार सुरक्षा" से आपका क्या मतलब है ... मॉड्यूल का उपयोग सामान्य प्रकार पैरामीटर के रूप में करने का कोई तरीका नहीं है, इसलिए आपको एक स्ट्रिंग का उपयोग करना होगा। यह दुर्भाग्यपूर्ण है, लेकिन अपरिहार्य है। – kvb
क्या इसे अभी भी एक पावर पैक की आवश्यकता है या क्या 5 साल बाद बेहतर तरीका है? – Maslow
मॉड्यूल नाम एक प्रकार नहीं है।
List
List.map
और let (a:List<int>) = [1;2;3]
अलग हैं।
पहला List
एक मॉड्यूल नाम है, दूसरा एक प्रकार है।
मैं 'FSharpType.IsModule (System.Type)' के बारे में चिंतित हूं, इसलिए मॉड्यूल आईएस प्रकार है, कम से कम सीएलआर शर्तों में। –
स्थिर श्रेणी (प्रकार) का नाम जो 'सूची' मॉड्यूल को संकलित किया गया है शायद 'ListModule' है। –
आपने मॉड्यूल के लिए एक मार्कर प्रकार जोड़ सकते हैं और फिर उस से मॉड्यूल के प्रकार की खोज:
module Foo =
type internal Marker = interface end
let t = typeof<Marker>.DeclaringType
यह भी Quotations का उपयोग किया जा सकता है। सबसे पहले, इस सहायक समारोह कहीं परिभाषित:
open Microsoft.FSharp.Quotations.Patterns
let getModuleType = function
| PropertyGet (_, propertyInfo, _) -> propertyInfo.DeclaringType
| _ -> failwith "Expression is no property."
उसके बाद, आप इस तरह एक मॉड्यूल को परिभाषित करने और अपने प्रकार प्राप्त कर सकते हैं:
module SomeName =
let rec private moduleType = getModuleType <@ moduleType @>
आशा इस मदद करता है।
यह इंटरैक्टिव में काम नहीं करता है, है ना? – BitTickler
यह मेरे लिए करता है, हालांकि मैंने दूसरे भाग को संशोधित किया: 'मॉड्यूल SomeName = rec rec मॉड्यूल टाइप करें = getModuleType <@ मॉड्यूल टाइप @> ;;', फिर 'SomeName.moduleType ;;' प्रकार की जानकारी आउटपुट करना चाहिए। –
यहां जानबूझकर होना। आपको ऐसा करने की आवश्यकता क्यों होगी? आप मॉड्यूल का नाम जानते हैं, फू, और मुझे नहीं लगता कि एफ # में मॉड्यूल को मान के रूप में पास करने की क्षमता है। धन्यवाद। – nlucaroni
आवश्यकता सरल है, मुझे कुछ स्वचालन की आवश्यकता है। मैं इसे प्रतिबिंब के साथ कर सकता हूं। PowerPack.Metadata मॉड्यूल के माध्यम से पुन: प्रयास करने की अनुमति देता है, लेकिन हो सकता है कि कुछ और आसान हो। –
मुझे इसे लिखने वाली लाइब्रेरी में दृढ़ता से टाइप किए गए एपीआई के लिए भी ऐसा करने की ज़रूरत है। – justin