Dimenzace proměnné s dynamickým typem   zodpovězená otázka

VB.NET

Dobrý den,

potřebuju poradit: vyrábím web, který používá zásuvné moduly. Toho dociluji tak, že mám nadefinovaný jmenný prostor CMS.Plugins, ve kterém jsou umístěny všechny moduly (jednotlivé VB soubory ve složce App_Code) jako třídy, které splňují interface IModule. Při načítání těchto modulů tedy pomocí následující funkce prohledám CMS.Plugins na všechny třídy:

        Private Function ClassesInNamespace(ByVal [nameSpace] As String) As List(Of String)
            Dim asm As Assembly = Assembly.GetExecutingAssembly()
            Dim namespaceList As New List(Of String)()
            Dim returnList As New List(Of String)()
            For Each type As Type In asm.GetTypes()
                If type.[Namespace] = [nameSpace] Then
                    namespaceList.Add(type.Name)
                End If
            Next

            For Each className As String In namespaceList
                returnList.Add(className)
            Next

            Return returnList
        End Function

Jak jste si jistě všimli, výsledek se mi vrátí v kolekci názvů typů (CMS.Plugins.Plugin1, CMS.Plugins.Plugin2...) Výstup ale potřebuji mít jako kolekci IModule, přičemž každý prvek bude představovat nadimenzovanou a zinicializovanou proměnnou. To dělám takto:

            Dim m As List(Of String) = ClassesInNamespace("CMS.Plugins")
            Dim LoadModules As New List(Of IModule)

            For Each s As String In m
                Dim t As Type = Type.GetType(s)
                Dim modul As New t()
                LoadModules.Add(modul)
            Next s

Problém ale nastává na tomto řádku: Dim modul As New t(). Bohužel nevím jakým způsobem se dá nadimenzovat proměnná s typem v proměnné hodnoty Type. Neví někdo, jak na to?

Díky moc

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nedá se napsat new T, datový typ musí kompilátor znát už za běhu. Jediná možnost je udělat to přes reflection - tedy místo new T si pomocí t.GetConstructors najít konstruktor, který chceme zavolat, a zavolat ho pomocí metody Invoke. Výsledek je třeba přetypovat na IModule, normálně to vrací Object.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dík moc

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback