2

我正在 AppDelegate.cs 中创建某个东西(数据库类)的实例,并希望从我的 ViewControllers 访问这个实例。它返回一个 CS0120 错误,“访问非静态成员 `GeomExample.AppDelegate._db' (CS0120) 需要对象引用”

我在 AppDelegate 中创建我的实例,如下所示:

[Register ("AppDelegate")]
    public partial class AppDelegate : UIApplicationDelegate
    {
        ...
        public Database _db;

        public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            ...
            _db = new Database (Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments), "myDb.db"));
            _db.Trace = true;

然后我尝试像这样访问它,这会产生错误:

IEnumerable<DbShapeElement> shapes = AppDelegate._db.GetShapeElements (_shapeName, null);

任何帮助表示赞赏!

4

1 回答 1

4

警告:我不知道 MonoTouch,但阅读这个问题:Monotouch:如何更新 AppDelegate 部分类中的文本字段?.

在我看来,这 :

public Database _db;是非静态的。您需要使用您拥有的 AppDelegate 的实例。

尝试这个:

var ad = (AppDelegate) UIApplication.SharedApplication.Delegate;
IEnumerable<DbShapeElement> shapes = ad._db.GetShapeElements (_shapeName, null);

编辑:

与其使用公共实例变量,不如使用带有私有 setter 的属性来防止在 AppDelegate 类之外进行修改:

[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
    ...
    public Database Db {
        get;
        private set;
    }

    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        ...
        Db = new Database (Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments), "myDb.db"));
        Db.Trace = true;
        ...

然后你在 AppDelegate 类之外像这样访问它:

var ad = (AppDelegate) UIApplication.SharedApplication.Delegate;
IEnumerable<DbShapeElement> shapes = ad.Db.GetShapeElements (_shapeName, null);
于 2012-12-24T01:55:27.450 回答