Announcement

Collapse
No announcement yet.

Methodennamen ersetzen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Methodennamen ersetzen?

    Ist es möglich, Methoden durch Variablen zu ersetzen?

    Also, einfaches Beispiel

    Code:
    DIM ers AS String
    
    ers = "write"
    System.Console.ers("blabla")
    
    ers = "writeline"
    System.Console.ers("blabla")
    so gehts natürlich, leider, nicht, aber so in der Art irgendwie. Geht das?

  • #2
    Das stichwort wäre hier Reflections. Damit solltest du sowas hinbekommen.

    Comment


    • #3
      danke für den Tip, das klingt vielversprechend, was ich jetzt dazu gefunden habe. Aber irgendwo blick ich noch nicht ganz, wie ich das dann richtig anwende.

      Ich habs so versucht, gibt aber nur ne NULL-Referenz-Exception:
      Code:
      Imports System.Reflection
      
      Module Module1
      
          Sub Main()
              Dim test() As String = {"Hallo"}
              Dim t As Type
              Dim mi As MethodInfo
      
              t = Type.GetType("System.Console")
              mi = t.GetMethod("Write(value As String)")
      
              mi.Invoke(Nothing, test)
      
              System.Console.ReadLine()
          End Sub
      
      End Module

      Comment


      • #4
        ich habe gerade festgestellt, das es garkeine Methoden sind, sondern Properties. Und diese Properties sind in der Interop.Outlook definiert.

        Also konkret geht es mir darum, KontaktDaten nach Outlook zu schreiben. Dabei soll der Benutzer frei wählen können, in welches Feld er was später stehen haben will. Von mir aus soll er den Namen ins Handy-Feld sschreiben, das ist seine Sache.
        Hierzu will ich allerdings jetzt nicht alle 256 OutlookFelder in einem select case definieren.

        Wenn ich das, was ich bisher über Reflection gelesen habe richtig verstanden habe, dann geht das damit auch. Ich finde nur nix, wo mal steht, wie ich das dann machen muss.

        Comment


        • #5
          Bei Properties geht das eigentlich genauso wie bei Methoden.
          Ein schönes Beispiel findest du in der Online Hilfe unter 'PropertyInfo.SetValue'.

          Comment


          • #6
            schon, aber scheinbar nur bei Lokalen Properties. Die Properties, an die ich ran muss befinden sich aber in Outlook.ContactItem. Da kann ich keinen Type bestimmen, da ContactItem keinen Member GetType hat. Somit kann ich auch kein GetProperty abfragen.
            Oder geh ich da einfach nur falsch dran?

            Comment


            • #7
              da ContactItem keinen Member GetType hat
              Sicher? GetType ist in System.Object definiert. Da gibts keinen Weg dran vorbei auch wenn das Interface aus einer Interop Assembly kommt.

              Comment


              • #8
                zumindest nicht so, als das ich dran käme.
                Code:
                CType(Kontakt, Object).GetType
                (Kontakt ist mein Outlook.ContactItem)
                das liefert mit NUR System.__ComObject, und dieses __ComObject ist irgendwas deafultmäßiges was der .netCompiler (oder so ähnlich) zurückgibt. Aber damit kann man nicht arbeiten, da es die ganzen Properties und Methoden des Typs, der dahinter verborgen ist, nicht freigibt.
                Code:
                Information.TypeName(Kontakt)
                da gibt er den richtigen TypeNamen zurück, aber der bringt mich auch nicht weiter. Den weiß ich auch ohne den Code

                Comment


                • #9
                  Wenn du nur ein ComObject zur Hand hast wird es etwas komplizierter.
                  System.Type hat eine InvokeMember Methode über die du die Property als String ansprechen kannst.

                  Da gehen mir aber gerade dann auch meine VB.Net Kenntnisse aus. In C# sähe das ungefähr so aus.

                  Code:
                  MeinObject.GetType().InvokeMember("MeineProperty", BindingFlags.PutDispProperty, null, MeinObject, new Object{meinWert});

                  Comment


                  • #10
                    Ich hab das mal auf VB zugeschnitten:
                    Code:
                    Dim t As Type = CType(Kontakt, Object).GetType
                    t.InvokeMember("FirstName", BindingFlags.PutDispProperty, Nothing, t, New Object() {"Andi"})
                    mit dem Ergebnis
                    Die Methode System.__ComObject.FirstName konnte nicht gefunden werden.

                    Comment


                    • #11
                      Du solltest Kontakt als Parameter übergeben und nicht t. Den du willst ja die Property an der Contact Instanz ändern und nicht an der Type Instanz die ja auch keine Firstname Property hat.


                      Code:
                      t.InvokeMember("FirstName", BindingFlags.PutDispProperty, Nothing, Kontakt, New Object() {"Andi"})

                      Comment


                      • #12
                        Ach, ich Idiot
                        Du hast natürlich recht und dann klappt es auch perfekt.

                        Danke für die Hilfe. Das ist eine große Erleichterung für mich.

                        Comment

                        Working...
                        X