2012-12-24 35 views
2

我正在AppDelegate.cs中創建一個(數據庫類)的實例並希望從我的ViewControllers訪問此實例。它返回一個錯誤CS0120「的對象引用才能訪問非靜態成員`GeomExample.AppDelegate._db」(CS0120)」Monotouch - 訪問應用程序級別變量(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

警告:我不知道MonoTouch,但讀到這個問題:Monotouch: How to update a textfield in AppDelegate partial class?

在我看來是:

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); 
+0

你是100%正確!你已經錯過了你的通話,採取Monotouch發展:) – Glinkot

+0

@Glinkot - 謝謝大聲笑。我實際上有一個MonoTouch許可證,但沒有OSX盒子。也許聖誕老人今年會好起來的。 –

+1

只是一個整容問題,但公共成員的名稱不應以下劃線開頭,而且使用類似'public DataBase Db {get;私人設置; }'。這確保只能從AppDelegate類中修改該值。 –