调用扩展应用程序的类时发生System.InvalidCastException

时间:2018-07-02 19:46:55

标签: c# android visual-studio android-activity casting

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

  

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
    }
 }

Activity.cs

MyApplication application = ((MyApplication)this.ApplicationContext); //here's the location of the exception
application.getDataFromDB();

我不知道为什么抛出此异常。在我看来,我的演员表似乎不对。你能帮我吗?

2 个答案:

答案 0 :(得分:0)

ApplicationContext不一定与Application实例是同一对象。我在仿真器中最经常看到这种情况,但它也可能是特定于设备的。

在Java应用程序中,可以强制转换Activity#getApplication()返回的对象。但是根据post on the Xamarin forum,Xamarin中不存在等效方法。相反,您可以投射Application属性:

MyApplication app = (MyApplication) Application;

我不确定何时设置该属性,因此这可能不适用于字段初始化程序。

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

答案 1 :(得分:0)

好吧,我通过删除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
}
}

然后我打电话给Application

MyApplication application = new MyApplication();