Einer meiner Baugruppen enthält die folgenden ‚Anbieter‘ Typen:Casting auf Basisklasse wirft InvalidCastException
ich auch eine XML-Datei, die Anbieterdaten mit der DeviceInfoProvider
Basisklasse hält. Eine vereinfachte Version sieht wie folgt aus:
<DeviceInfoProvider Type="SbRioI2CProvider" Assembly="assembly.dll" >
</DeviceInfoProvider>
<DeviceInfoProvider Type="GenericProvider" Assembly="assembly.dll" >
</DeviceInfoProvider>
Zur Laufzeit Karte I XML-Felder meiner Variablen:
assembly.dll ⇒ assemblyPath
Type ⇒ typeName
und nach dem Lesen von XML, verwenden Sie den folgenden Code meine Typen zu instanziiert:
var assembly = Assembly.LoadFrom(assemblyPath);
var type = (from t in assembly.GetTypes()
where t.IsPublic && t.Name == typeName
select t).FirstOrDefault();
if (type != null)
{
instance = type.GetConstructor(Type.EmptyTypes).Invoke(null);
}
Wie erwartet, generiert dies meine Objekte entsprechend.
Das Problem kommt, wenn ich versuche Instanz als Basisklasse Objekt zu werfen:
using (var provider = instance as DeviceInfoProvider)
{
// provider is null!
}
Der Laufzeittyp von instance
ist die erwartete abgeleitete Klasse, aber ich bin nicht in der Lage erfolgreich es zu seinem Basistyp zu werfen.
Was fehlt mir?
Was ist der Wert der Variablen 'typeName'? Lesen Sie aus dem XML- oder einem Const-String-Wert "DeviceInfoProvider"? – llj098
sind alle diese Typen in der gleichen Baugruppe? –
@mikez: die aus XML geladenen Typen müssen nicht alle in derselben Baugruppe sein –