У нас есть настройка, при которой мы запускаем экран обработки для местоположений клиентов. Когда мы пытаемся обновить местоположение в кеше местоположения, мы получаем следующую ошибку:
Unable to cast object of type
'PX.Data.PXCache`1[PX.Objects.AR.SelectedCustomerLocation]' to type
'PX.Data.PXCache`1[PX.Objects.CR.Location]'.
Вот упрощенная версия кода, который мы используем. Метод ProcessLocation
- это делегат PXProcessing:
public class LocationMaint_Extension : PXGraphExtension<LocationMaint>
{
public virtual void ProcessLocation(Location loc)
{
LocationExt locExt = loc.GetExtension<LocationExt>();
locExt.UsrCustomField = "New Value";
Base.Caches<Location>().Update(loc);
}
}
Нам известно, что SelectedCustomerLocation является производным от SelectedLocation, которое является производным от Location. Из-за этого мы ожидаем, что приведенный выше код будет успешно работать, поскольку присутствует наследование.
Если мы напишем следующий код, метод будет успешным, и экран будет успешно обновлен. Однако изменение, которое мы внесли в настраиваемое поле, не сохраняется в базе данных:
public class LocationMaint_Extension : PXGraphExtension<LocationMaint>
{
public virtual void ProcessLocation(Location loc)
{
LocationExt locExt = loc.GetExtension<LocationExt>();
locExt.UsrCustomField = "New Value";
Base.Caches<SelectedCustomerLocation>().Update(loc as SelectedCustomerLocation);
// We had this code in as well, which did not seem to help
Base.Caches<SelectedCustomerLocation>().Persist(PXDBOperation.Insert);
Base.Caches<SelectedCustomerLocation>().Persist(PXDBOperation.Update);
}
}
Любая помощь будет принята с благодарностью. Спасибо.
В C# (и .NET в целом) вы не можете преобразовать объект типа G<Derived>
в G<Base>
, где G
является универсальным типом. Иногда это своего рода боль. Раньше я создавал для этого специальные методы, например, для List<T>
, вы можете использовать что-то вроде этого:
static List<TBase> Upcast<TBase, TDerived>(this List<TDerived> list)
where TDerived : TBase
{
var result = new List<TBase>();
foreach (var d in list)
{
result.Add(d);
}
return result;
}
Ошибка заключается в коде с использованием PXCache<T>
с этими двумя параметрами в качестве общих. Я не уверен, что такое PXCache<T>
.
Привет, JamesFaix, спасибо за ответ. Рассматриваемые типы на самом деле не являются общими типами, это
Location
иSelectedCustomerLocation
. Мы уже пытались создать новый объектLocation
для методаUpdate()
, но он все еще искалSelectedCustomerLocation
. Похоже, это проблема, специфичная для Acumatica, когда они изменяют тип в кэше.