InvalidCastException при приведении Android.App.Application.Context

Я безрезультатно искал проблемы, похожие на ту, с которой столкнулся, поэтому приношу извинения, если на этот вопрос был дан ответ в другом месте. Я нашел многие, которые казались смежными, но ни один из ответов, которые я нашел до сих пор, не помог в моем конкретном контексте.

Я разрабатываю приложение Xamarin.Android, которое использует экземпляр приложения для хранения некоторых глобальных переменных. Вот мой класс приложения:

[Register("android/app/Application", DoNotGenerateAcw = true)]
public class MainApplication : Application
{
    public VariablesModel Variables { get; set; }  

    public MainApplication(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
        Variables = new VariablesModel();
    }        
}

Обычно я могу получить доступ к этому экземпляру приложения изнутри действия (или контекста действия), выполнив следующие действия:

var application = (MainApplication)Application.Context;
var variables = application.Variables;

Это новая разработка, что первая строка из двух выше выдает System.InvalidCastException при попытке привести к MainApplication. Что меня особенно смущает, так это то, что у нас есть поставленные версии этого приложения, которые успешно используют приведенный выше код. Только сейчас в моей среде разработки я не могу заставить ее работать, даже когда я извлекаю эти предыдущие рабочие версии.

Единственное, что я могу думать, это то, что обновление Android SDK вызвало эту разницу в поведении, но мне еще предстоит найти какую-либо документацию (или увидеть какие-либо полезные исключения, кроме InvalidCast), которые помогут прояснить, что мне не хватает. MainApplication наследует Application, и хотя Application.Context указан как тип Context, опять же, это приведение работало для меня в прошлом.

Есть что-то, что мне не хватает? Что мне нужно сделать, чтобы получить доступ к работающему экземпляру приложения?


person draconastar    schedule 23.07.2020    source источник


Ответы (1)


Вы должны добавить отметку [Application] над классом MainApplication.

Что-то типа

[Application]
public class MainApplication : Application
{
    public string Variables { get; set; }

    public MainApplication(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
        
    }
    public override void OnCreate()
    {
        base.OnCreate();
        //it's better to initialize property in this method 
        Variables = "123";      
    }
}

См. Как расширить класс приложения в xamarin android.

person ColeX - MSFT    schedule 24.07.2020
comment
Это сработало! В частности, добавление атрибута Application и удаление атрибута Register из моего класса должны были произойти, чтобы приведение снова заработало (я отредактировал, чтобы добавить это выше, не скопировав его изначально). Мне очень любопытно, что изменилось, что помешало работе моего исходного класса. В прошлом у этого типа приведения не было проблем, и единственное различие, которое, как мне кажется, имеет смысл, — это моя версия Android SDK. Любая идея, почему вышеперечисленное больше не будет работать? - person draconastar; 24.07.2020