C# 调用扩展应用程序的类时System.InvalidCastException

C# 调用扩展应用程序的类时System.InvalidCastException,c#,android,visual-studio,android-activity,casting,C#,Android,Visual Studio,Android Activity,Casting,我正在开发一个安卓c#应用程序,其中有一个类扩展自Application,名为MyApplication。在MyApplication文件中,我有一个名为getDataFromDB()的方法。我试图从我的活动中调用此方法,但在运行时遇到此异常: System.InvalidCastException: MyApplication.cs public class MyApplication : Application { public MyApplication(IntPtr handle

我正在开发一个安卓c#应用程序,其中有一个类扩展自
Application
,名为
MyApplication
。在
MyApplication
文件中,我有一个名为
getDataFromDB()
的方法。我试图从我的
活动中调用此方法,但在运行时遇到此异常:

System.InvalidCastException:

MyApplication.cs

public class MyApplication : Application
{
    public MyApplication(IntPtr handle, JniHandleOwnership ownerShip) : base(handle, ownerShip)
    {
    }

    public override void OnCreate()
    {
        base.OnCreate();

        getDataFromDB();
    }

    public void getDataFromDB()
    { // code
    }
 }
MyApplication application = ((MyApplication)this.ApplicationContext); //here's the location of the exception
application.getDataFromDB();
活动.cs

public class MyApplication : Application
{
    public MyApplication(IntPtr handle, JniHandleOwnership ownerShip) : base(handle, ownerShip)
    {
    }

    public override void OnCreate()
    {
        base.OnCreate();

        getDataFromDB();
    }

    public void getDataFromDB()
    { // code
    }
 }
MyApplication application = ((MyApplication)this.ApplicationContext); //here's the location of the exception
application.getDataFromDB();

我不知道为什么会抛出此异常。在我看来,我的演员阵容似乎没有错。您能帮助我吗?

应用程序上下文
与应用程序实例不一定是同一个对象。我经常在模拟器中看到这种情况,但也可能是特定于设备的

在Java应用程序中,您可以强制转换由返回的对象。但根据a,Xamarin中不存在等效方法。相反,您可以强制转换
应用程序
属性:

MyApplication app = (MyApplication) Application;
我不确定该属性何时设置,因此在字段初始值设定项中可能不起作用


另一个选项是让
MyApplication
OnCreate()
中保存对自身的静态引用,并提供静态getter。尽管静态字段通常是有害的,但这是有效的,因为
应用程序
实例实际上是一个单例,其
OnCreate
将在创建任何其他组件之前被调用。静态引用不能泄漏应用程序,因为应用程序已经与进程具有相同的生存期。

好吧,我通过删除
MyApplication
的构造函数的参数来解决它,如下所示:

 public class MyApplication : Application
{
public MyApplication() : base(handle, ownerShip) //here's the editing location
{
}

public override void OnCreate()
{
    base.OnCreate();

    getDataFromDB();
}

public void getDataFromDB()
{ // code
}
}
然后我调用了
应用程序

MyApplication application = new MyApplication();

InvalidCastException
肯定意味着铸造有问题。您是否尝试过通过某个调试器检查
this.ApplicationContext
的运行时类型,即
ApplicationContext
不一定是
应用程序
实例。@TKK那么我需要写什么呢?我尝试了
MyApplication=((MyApplication)this.application)但我也得到了一个例外。