Ich habe eine App, die Klassen dynamisch mit Reflektion erstellt. Bei der Bereitstellung wird eine Ausnahme ausgelöst, wenn eine abgeleitete Klasse in ihre Basisklasse umgewandelt wird. Es passiert nur bei 1 von 100 Maschinen. Alle Klassen befinden sich in derselben Baugruppe. Im Folgenden finden Sie einige Code-Snippets und die Ausgabe aus einer Protokollierungsnachricht unmittelbar vor der Ausnahme für das Casting. Ich bin am Ende meiner Weisheit, jede Hilfe sehr geschätzt.C# Cast abgeleitete Klasse zu Basisklasse Ausnahme über Reflexion
//Parent class
namespace Framework.DataModel
{
[Serializable]
public class DataTreeRequest : TreeNode, IDirtyListener, ISerializable
{
....
}
}
// Derived Class
namespace Framework.DataModel
{
[Serializable]
public class CADElementRequest : DataTreeRequest
{
public CADElementRequest(String name) : base(name){}
}
}
// Method that uses reflection to create class and then cast to its base class
namespace Framework.DataModel
{
[Serializable]
public class DataModelBuilder : CoreBuilder
{
...
protected DataTreeRequest CreateDataTreeRequest(String asmName, String inName, String inType, String inSourceName)
{
DataTreeRequest dtr = null;
Assembly asm = Assembly.LoadFrom(asmName);
if (asm == null)
{
throw new BaseException("Can't find assembly " + asmName);
}
Type requestType = asm.GetType(inType);
if (requestType == null)
{
throw new BaseException("Can't find class of type " + inType + " in assembly " + asmName);
}
// Call the constructor for the tree node that takes the xml node as an argument
Type[] constructorArgsTypes = new Type[1];
constructorArgsTypes[0] = typeof(String);
ConstructorInfo constructorInfo = requestType.GetConstructor(constructorArgsTypes);
if (constructorInfo == null)
{
throw new BaseException("Can't find constructor for type " + inType + " that takes a String param");
}
Object[] constructorArgs = new Object[1];
constructorArgs[0] = inName;
Object newObj = constructorInfo.Invoke(constructorArgs);
// Code fails on this line trying to cast derived class to base class on 1 in 100 machines
dtr = newObj as DataTreeRequest;
if (dtr == null)
{
throw new BaseException("Can't cast newObj to type DataTreeRequest. newObj = " + newObj + ", Type = " + newObj.GetType().ToString());
}
dtr.InSource = inSourceName;
return dtr;
}
}
}
Logging Ausgabe auf ausgefallene Maschine:
Message = Gefunden Montag = Framework.DataModel, Version = 1.0.5885.31486, Culture = neutral, PublicKeyToken = null
Message = NEWOBJ AssemblyQualifiedName = Framework.DataModel.CADElementRequest, Framework.DataModel, Version = 1.0.5885.31486, Culture = neutral, PublicKeyToken = null, Basetype == Framework.DataModel.DataTreeRequest, FullName == Framework.DataModel.CADElementRequest
BaseException: Kann newObj nicht umschreiben, um DataTreeRequest einzugeben. NEWOBJ = Name = Umspannwerke; InType =; inname = Umspannwerke; OutName = Umspannwerke; InSource =; Outsource = ;, Type = Framework.DataModel.CADElementRequest
eine Behauptung hinzu 'newObj.GetType(). Baseclass == typeof (DataTreeRequest)'. Sollte Feuer machen. Fügen Sie außerdem die Protokollierung für die vollqualifizierten Typnamen hinzu. Gibt es möglicherweise mehrere Versionen derselben Baugruppe? Vielleicht ein Fehler bei der Bereitstellung? – usr
Es ist bereits auf der Fehlermeldung "BaseType == Framework.DataModel.DataTreeRequest, " – CodeNotFound
@CodeNotFound das ist nur der Typ Name, Assembly fehlt. – usr