2

AppDelegate.csで何か(データベースクラス)のインスタンスを作成していて、ViewControllersからこのインスタンスにアクセスしたいと考えています。「非静的メンバー`GeomExample.AppDelegate._db'(CS0120)にアクセスするにはオブジェクト参照が必要です」という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);

編集:

パブリックインスタンス変数を使用する代わりに、プライベートセッターでプロパティを使用して、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 に答える