2013-06-20 42 views
1

我有2個現有函數。一個我不能編輯(getServiceNames),第二個我需要設置一個字符串(getDataTableOne)。 我想用同一個類中的函數設置這個字符串(getAllExceptNiServiceNames),但是他給了我這個錯誤,因爲我想編輯的函數是靜態的。對象引用是必需的非靜態字段,方法或屬性錯誤

內的對象引用所需的非靜態字段,方法或屬性 「Queries.getAllExceptNiServiceNames()」

我不能去除功能的靜態屬性和我還可以」創建一個字符串對象。 最好的解決辦法是什麼?

public static DataSet getDataTableOne() 
{ 
string serviceNameFilterLineThree = getAllExceptNiServiceNames(); //ERROR 
} 

public static DataSet getServiceNames() 
    { 
     DataSet ds = new DataSet(); 
     string query_select = "select test"; 

     ds = QualityGate.fillDataset(query_select); 
     return ds; 
    } 

public string getAllExceptNiServiceNames() 
{ 
    string sql = ""; 
    DataSet ds = getServiceNames(); 
    int i = 0; 
    foreach (DataRow theRow in ds.Tables[0].Rows) 
    { 
     if (i != 0) 
      sql += "AND "; 

     sql += "serviceName = '" + theRow["serviceName"].ToString() + "' "; 

     i++; 
    } 
    return sql; 
} 

回答

5

您需要聲明的方法爲靜態:

public static string getAllExceptNiServiceNames() { ... } 

或可選擇地使用該方法之前創建類的實例:

var q = new Queries(); 
string serviceNameFilterLineThree = q.getAllExceptNiServiceNames(); 
+1

@Dan:我同意這個方法需要是靜態的,但是你包含的代碼沒有'static'關鍵字! –

+0

感謝它的工作原理,如果我只是把這個功能做成靜態的,那就足夠了。 – Freddy

1

不能調用非靜態方法從靜態方法。所以你必須寫

public static string getAllExceptNiServiceNames() 
{ 
    string sql = ""; 
    DataSet ds = getServiceNames(); 
    int i = 0; 
    foreach (DataRow theRow in ds.Tables[0].Rows) 
    { 
     if (i != 0) 
      sql += "AND "; 

     sql += "serviceName = '" + theRow["serviceName"].ToString() + "' "; 

     i++; 
    } 
    return sql; 
} 

這可能會解決你的錯誤。

1

我認爲丹的答案可能會解決您的直接問題,但我有點想知道它是否會幫助您快速瞭解運算符的含義;這在我的CS研究中很早就讓我感到困惑,而且我認爲我陷入了一種只是聲明一切都是靜態的模式,因爲「這是它的唯一工作方式」。

在一些語言中,非靜態函數(或「目標函數」讓我們說)都是這樣聲明:

function Account.withdraw(self, amt) 
    self.balance -= amt; 
end 

self部分是該方法在操作的對象的引用;所以如果你有5個賬戶,並且你撥打bobAccount:withdraw(5),只有Bob的賬戶虧本,因爲bobAccount變成了self。 (如果你想知道,那種語言叫做Lua)。在C#中,這也只是聲明的類Account裏面這樣...

public void withdraw(double amt) { 
    balance -= amt; 
} 

注意,有沒有更多的「自我」。默認情況下,C#方法對對象的實例進行操作,並假定變量名稱引用作爲類的一部分聲明的變量實例。

static方法是不綁定到任何單個對象的方法。如果您的操作與帳戶密切相關,但不僅僅使用它們的一個特定實例 - 或者,如果您以特殊方式創建對象,那麼這可能是合適的,正如您在getServiceNames()中所做的那樣。 (這些可以稱爲「工廠方法」)。因此,如果您想要在特定對象上使用靜態方法,則可以將該方法聲明爲static,或者在該對象的特定實例上調用該函數(oneObject.myFunction()

因此,我不會告訴你完全應該如何設計你的程序,但是我希望給你一個關於如何組織的更好的想法,讓你在你自己的想法中更好地理解你想要的方式。

相關問題