Szenario:Kann Objekt vom Typ 'System.Object []' nicht in 'MyObject []' umgewandelt werden, was gibt es?
Ich schreibe gerade eine Schicht, um 3 ähnliche Webservices in eine verwendbare Klasse zu abstrahieren. Jeder Webservice macht eine Reihe von Objekten verfügbar, die Gemeinsamkeiten aufweisen. Ich habe eine Reihe von Zwischenobjekten geschaffen, die die Gemeinsamkeit ausnutzen. In meinem Layer muss ich jedoch zwischen den Web-Service-Objekten und meinen Objekten konvertieren.
Ich habe Reflexion verwendet, um den geeigneten Typen zur Laufzeit zu erstellen, bevor ich den Anruf an den Web-Service zu machen, wie so:
public static object[] CreateProperties(Type type, IProperty[] properties)
{
//Empty so return null
if (properties==null || properties.Length == 0)
return null;
//Check the type is allowed
CheckPropertyTypes("CreateProperties(Type,IProperty[])",type);
//Convert the array of intermediary IProperty objects into
// the passed service type e.g. Service1.Property
object[] result = new object[properties.Length];
for (int i = 0; i < properties.Length; i++)
{
IProperty fromProp = properties[i];
object toProp = ReflectionUtility.CreateInstance(type, null);
ServiceUtils.CopyProperties(fromProp, toProp);
result[i] = toProp;
}
return result;
}
Hier ist meine Berufung Code, von einem meiner Service-Implementierungen:
Property[] props = (Property[])ObjectFactory.CreateProperties(typeof(Property), properties);
_service.SetProperties(folderItem.Path, props);
So stellt jeder Dienst ein anderes "Property" -Objekt aus, das ich hinter meiner eigenen Implementierung meiner IProperty-Schnittstelle versteckt habe.
Der Reflexionscode funktioniert in Komponententests und erzeugt ein Array von Objekten, deren Elemente den entsprechenden Typ aufweisen. Aber der aufrufende Code fehlschlägt:
System.InvalidCastException: Kann nicht Gussobjekt des Typs 'System.Object []' eingeben ‚MyProject.Property []
Irgendwelche Ideen?
Ich hatte den Eindruck, dass jede Umwandlung von Object funktioniert, solange das enthaltene Objekt konvertierbar ist?
Nun, ich habe gesagt "In C# 2.0 und höher, Generika machen in der Regel eine bessere Option als Array Kovarianz.". Ich fürchte, ich musste meine +1 in Ihrem letzten Beitrag annullieren, um +1 zu geben ... Ich bin für heute out ... –
Wohl, es gibt etwas ein wenig zwielichtig für die Länge == 0 Fall - I würde ein leeres Array selbst zurückgeben ... –
Bearbeitet, um Anklage zu entfernen :) Und ja, die Rückgabe von null ist möglicherweise ein bisschen zweifelhaft - aber das ist eine Frage für das OP zu entscheiden :) –