2017-02-12 12 views
3

На самом деле это очень странное исключение, потому что это происходит только тогда, когда я строю проект как Release и не происходит вообще, когда я выбираю Debug. В режиме отладки приложение работает отлично, и следующий код работает хорошо.Activator.CreateInstance (тип) Выдает исключение

Вот код моего метода расширения:

public static T DeepClone<T>(this T source) where T : UIElement 
{ 
    T result; 

    // Get the type 
    Type type = source.GetType(); 

    // Create an instance 
    result = Activator.CreateInstance(type) as T; //throws exception here only if I build project as (release) 

    CopyProperties<T>(source, result, type); 
    DeepCopyChildren<T>(source, result); 

    return result; 
} 

Исключение:

Исключение из 'System.MissingMethodException' типа произошло в System.Private. Reflection.Execution.dll, но не обрабатывался у пользователя код

Дополнительная информация: MissingConstructor_Name, Windows.UI.Xaml.Controls.RelativePanel. Для получения дополнительной информации посетите http://go.microsoft.com/fwlink/?LinkId=623485

Я нашел некоторые связанные вопросы этого исключения, но все они указывают на отсутствующие библиотеки или библиотеки обновления, как this, но ничего не изменилось в моем приложении.

+1

Несвязанный, но 'как T' полезен, когда результат может быть не типа' T'. Функционально, 'x as T' означает' x is T? (T) x: null', за исключением того, что 'x' оценивается только один раз. Вы знаете, что 'x is T' обязательно всегда истинно, и в маловероятном случае, когда вы где-то ошиблись, получение исключения немедленно облегчает отладку, чем' NullReferenceException' где-то внутри 'CopyProperties'. Поэтому я рекомендую '(T) Activator.CreateInstance (type)'. – hvd

ответ

6

Эта проблема связана с тем фактом, что выпускная сборка приложений UWP использует .NET родную toolchain. В этом режиме отражение нуждается в некоторых подсказках для правильной работы. По-видимому, конструктор RelativePanel недоступен для отражения.

К счастью, существует обходное решение для этого, как описано в this blogpost.

В папке «Свойства» проекта UWP находится файл с именем default.rd.xml. Откройте его и добавьте следующую строку внутри <Applications> элемента:

<Type Name="Windows.UI.Xaml.Controls.RelativePanel" 
     Dynamic="Required All" Activate="Required All" /> 

Атрибут Dynamic должен обеспечить отражение возможно и атрибут Activate должен обеспечить конструкторы доступны для активации - который является ключевым для Вашего случая.

Это должно включать в себя всех членов RelativePanel для отражения, и все должно работать должным образом.

Подробнее о структуре default.rd.xmlhere.

+0

Спасибо, на самом деле я попробовал исправить, очистить решение и создать (выпуск), но, к сожалению, все равно получаю то же самое. –

+0

Тогда я бы предложил попробовать сделать манекен методом, который просто создаст экземпляр 'RelativePanel' (' new RelativePanel() ') и может вызвать метод или установить на нем свойство. Затем перекомпилируйте в Release и посмотрите, присутствует ли данный тип или нет. –

+0

Я обновил свой ответ другим атрибутом, который должен действительно исправить вашу проблему :-) - атрибут «Активировать». –