Entwickler-Ecke

Basistechnologien - Reflection, late Binding: Typumwandlung und enumerationen


Telefisch - Do 18.06.09 14:50
Titel: Reflection, late Binding: Typumwandlung und enumerationen
Hallo Forum,
ich stehe vor zwei Problemen beim späten binden einer assembly.

Mein erstes Problem sind Enumerationen.
Es gibt einige Methoden, denen Enumerationen aus der assembly übergeben werden müssen.
Wie komme ich an die Enumerationen heran?

Als Beispiel habe ich folgenden Methodenaufruf:


C#-Quelltext
1:
arrStorableObjects = oInsert.GetType().InvokeMember( "PageMacro", BindingFlags.InvokeMethod, null, oInsert, new object[5] { MacroName, oPage, oProject, false, PageMacro.Enums.NumerationMode.None } );                    


Hier ist der 5. Parameter aus der assembly, was natürlich so lange funktioniert, wie die Assembly eingebunden ist.


Das zweite Problem habe ich beim Setzen eines Properties:


C#-Quelltext
1:
propertyInfo.SetValue( pagePropertyList,(PropertyValue) "1000"null );                    


Wie hier zu sehen, erwartet das Objekt einen Property-Wert in Form von PropertyValue.
PropertyValue ist aber ein spezifischer Typ aus der Assembly.
Wie kann ich den String ("1000") so casten, dass es ein PropertyValue ist?

Ich hoffe ich habe mich einigermaßen verständlich gemacht, sonst fragt einfach.

Danke im Vorraus
Tele


Kha - Do 18.06.09 16:12

user profile iconTelefisch hat folgendes geschrieben Zum zitierten Posting springen:
ich stehe vor zwei Problemen beim späten binden einer assembly.
Was genau hast du denn vor? Assemblies werden eigentlich sowieso "relativ spät" gebunden: erst beim Aufruf der ersten Methode, die einen Typ daraus benutzt. Reflection ist normalerweise nur bei Addin-Mechanismen nötig.


Telefisch - Do 18.06.09 16:37

Hallo Kha

Genau das ist mein Problem...
Ein AddIn für Excel in dem ich eine Drittanbieter dll verwende.

Also das Problem mit der Typumwandlung hab ich gelöst.
Da gibt es eine Klasse, die bei früher Bindung implizit die Property-Eigenschaft umwandelt.
Die hab ich halt manuell aufrufen müssen.

Jetzt stehe ich noch vor dem Problem mit dem Enumerator.

Da hab ich nooch etwas schwierigkeiten.

Im Augenblick ists so:


C#-Quelltext
1:
2:
3:
4:
5:
6:
//lade Assembly
//assemblyPath ist hier der Dateipfad zur dll
Assembly externalAssembly = Assembly.LoadFrom( assemblyPath, new Evidence( Assembly.GetExecutingAssembly().Evidence ) );
//Typ und Feld aus externer Assembly holen
//wobei hier typeName = "Eplan.EplApi.DataModel.MasterData" und enumeratorList = "PageMacro.Enums.NumerationMode" ist.
return externalAssembly.GetType( typeName + "." + enumeratorList ).GetField( enumeratorName ).GetValue( null );


Haaabs aber grade gelöst:
enumeratorList musste "PageMacro+Enums+NumerationMode" sein (man achte auf die "+" statt "."

Aber danke für die Rückfrage.
Manchmal löst sichs von selbst, beim Antworten ;)