Сценарий:
В настоящее время я пишу слой для абстрагирования 3 похожих веб-сервисов в один пригодный для использования класс. Каждый веб-сервис предоставляет набор объектов, которые имеют общие черты. Я создал набор промежуточных объектов, которые используют общность. Однако в моем слое мне нужно конвертировать между объектами веб-сервиса и моими объектами.
Я использовал отражение, чтобы создать соответствующий тип во время выполнения, прежде чем сделать вызов веб-службе, например:
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;
}
Вот мой код вызова из одной из моих реализаций службы:
Property[] props = (Property[])ObjectFactory.CreateProperties(typeof(Property), properties);
_service.SetProperties(folderItem.Path, props);
Таким образом, каждый сервис предоставляет свой объект «Свойство», который я скрываю за собственной реализацией моего интерфейса IProperty.
Код отражения работает в модульных тестах, создавая массив объектов, элементы которых имеют соответствующий тип. Но вызывающий код не работает:
System.InvalidCastException: невозможно
приведенный объект типа 'System.Object []'
печатать
«MyProject.Property []
Есть идеи?
У меня сложилось впечатление, что любое приведение из Object будет работать, пока содержащийся объект конвертируем?