Я пытаюсь понять одну проблему, с которой я столкнулся, когда работал над приложениями UWP. Мне удалось исправить эту проблему, но я все еще не понимаю ее объяснение / доводы.
Я использую EventTriggerBehavior из XAMLBehaviours SDK в своей кодовой базе. Это событие должно было проверить «ClickedItem» в GridView.
Метод IAction.Execute из Microsoft.Xaml.Interactivity получает событие ClickedItem в качестве параметра.
Определение функции - объект IAction.Execute (отправитель объекта, параметр объекта)
Когда я запускал приложение в режиме отладки, оно работало нормально, и параметру присваивались правильные значения. Но когда я настроил Release, я понял, что мой Behaviors SDK работает некорректно.
Это был предыдущий фрагмент кода:
object IAction.Execute(object sender, object parameter)
{
object propertyValue = parameter;
foreach (var propertyPathPart in propertyPathParts)
{
var propInfo = propertyValue.GetType().GetTypeInfo().GetDeclaredProperty(propertyPathPart);
if (propInfo != null)
propertyValue = propInfo.GetValue(propertyValue);
}
}
При дальнейшем исследовании я понял, что propertyValue не инициализируется с правильным значением. Следовательно, чтобы исправить это, я применил параметр Type Cast on.
object propertyValue = parameter as ItemClickEventArgs;
Теперь все стало нормально работать в Release Mode, в том числе и при включенной оптимизации кода.
Я бы сказал, что System.reflection не работает нормально в режиме Release, когда была включена цепочка инструментов Compile with .NET Native. Когда я сделал неявное приведение, это больше не было проблемой.
Согласно этому видео https://channel9.msdn.com/Shows/Going+Deep/Inside-NET-Native, Reflection все еще работает, но мне пришлось использовать кастом для Behaviors SDK. Я хотел бы узнать об этом более подробную информацию и правильно это понять.