2015-10-22 3 views
5

में एफ # प्रकार के लिए काम नहीं कर रहा मैं एक एफ # विधानसभा Assembly1Type.GetType() सी # कोड

कहा जाता है मैं निम्नलिखित मॉड्यूल है:

namespace Assembly1 

module MyModule = 
    type MyClass(x: int, y: int) = 
    new() = MyClass(0, 0) 

एक सी # विधानसभा यह एफ # विधानसभा संदर्भ में, निम्नलिखित कोड मुझे 'शून्य' का मान देता है:

var myType = Type.GetType("Assembly1.MyModule.MyClass, Assembly1"); 

क्या मैं संभव नहीं कर रहा हूं?

उत्तर

5

चूंकि आपने मॉड्यूल में MyClass डाल दिया है, इसे एक नेस्टेड क्लास के रूप में संकलित किया गया है। इसका नाम Assembly1.MyModule+MyClass है।

var myType = Type.GetType("Assembly1.MyModule+MyClass, Assembly1"); 

आप नेस्ट वर्गों (जो आम तौर पर सी # में पर सिकोड़ी कर रहे हैं) के लिए नहीं करना चाहते हैं, तो आप सीधे में परिभाषित कर सकते हैं:

सी # से, आप इस तरह लोड करने के लिए सक्षम होना चाहिए एक नामस्थान:

namespace Assembly1.LibraryXyz 

type MyClass(x: int, y: int) = class end 

इस वर्ग का नाम Assembly1.LibraryXyz.MyClass होगा।

+0

उत्तर के लिए धन्यवाद। अच्छी तरह से काम! – bstack

6

Mark's answer में जोड़ने के लिए, यह भी ध्यान देने योग्य है कि एफ # में बहुत से मॉड्यूल आईएल (और इसलिए गैर-एफ # भाषाओं) में अलग-अलग नामों से दर्शाए जाते हैं, जो कि वे एफ # में दिखाई देते हैं।

उदाहरण के लिए

, कोड के इस टुकड़े:

open System 
open System.Reflection 
open Microsoft.FSharp.Reflection 

let private core = 
    AppDomain.CurrentDomain.GetAssemblies() 
    |> Seq.find (fun a -> a.GetName().Name = "FSharp.Core") 

let private seqMod = 
    core.GetTypes() 
    |> Seq.filter FSharpType.IsModule 
    |> Seq.find (fun t -> 
        t.FullName = "Microsoft.FSharp.Collections.SeqModule") 

FSharp.Core में Seq मॉड्यूल मिल जाएगा।

एफएसएचआरपी। रिफ्लेक्शन नेमस्पेस में सिस्टम के साथ एफ # विशिष्ट प्रकारों के साथ काम करने के लिए सहायक तरीकों का एक गुच्छा है। थोड़ा कम दर्दनाक प्रतिबिंब, इसलिए एफएसआई में कुछ असेंबली लोड करना और उन लोगों के साथ खेलना उचित है आप एफ # कोड के साथ बहुत सारे प्रतिबिंब काम करने जा रहे हैं।

आप CompiledName विशेषता का उपयोग करके इस तरह के "मिस्चैचिंग" नामों के साथ मॉड्यूल बना सकते हैं - यह विशेष रूप से उन समयों के लिए उपयोगी होता है जहां आप एक ही नाम के साथ एक प्रकार और मॉड्यूल चाहते हैं। सामान्य सम्मेलन (जैसा कि सेक प्रकार/मॉड्यूल के साथ दिखाया गया है) मॉड्यूल को संकलित नाम के साथ एनोटेट करना है।

[<CompiledName("MyTypeModule")>] 
module MyType = 
    let getString m = 
     match m with 
     | MyType s -> s 
संबंधित मुद्दे