2013-06-20 7 views
1

У меня есть две существующие функции. Один я не могу редактировать (getServiceNames), а во второй мне нужно установить строку (getDataTableOne). Я хочу установить эту строку с функцией в том же классе (getAllExceptNiServiceNames), но он дает мне эту ошибку, потому что моя функция, которую я хотел бы изменить, является статической.Требуется ссылка на объект нестатического поля, метода или ошибки свойства

Ссылка на объекте требуется нестатическое поле, метод или свойство «Queries.getAllExceptNiServiceNames()»

Я не могу удалить статическое свойство функции и я также могу» t создать строковый объект. Каков наилучший способ исправить это?

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

Спасибо, что работает, если я только сделал функцию static, и этого было достаточно. – 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

Я думаю, что ответ Дэна может решить вашу непосредственную проблему, но я немного удивлен, если это поможет вам получить краткий обзор того, что означает оператор static; это смутило меня в начале моих исследований в области CS, и я думаю, что я попал в образец, просто объявляя все статичным, потому что «это единственный способ, которым это работало».

В некоторых языках, не статические функции (или «функции объекта», скажем) все объявлены следующим образом:

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

Это self часть является ссылкой на объект, что метод работает на; поэтому, если у вас 5 учетных записей, и вы звоните bobAccount:withdraw(5), только счет Боба теряет деньги, потому что bobAccount становится self. (Если вам интересно, этот язык называется Lua). В C#, это было бы просто объявляться таким образом внутри класса Account ...

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

Обратите внимание, что там больше нет «я». По умолчанию методы C# работают в экземпляре объекта, и предполагается, что имена переменных относятся к экземплярам переменных, объявленным как часть класса.

static методы - это методы, которые не привязаны ни к одному отдельному объекту. Это может быть подходящим, если у вас есть операция, которая очень тесно связана с Учетными записями, но не просто использует один конкретный экземпляр из них - или, если вы создаете объект особым образом, как вы делаете в getServiceNames() , (Они могут быть известны как «заводские методы»). Поэтому, если у вас есть статический метод, который вы хотите использовать для определенного объекта, вы можете объявить этот метод как static или вызвать функцию в конкретном экземпляре этого объекта (oneObject.myFunction())

Так что я не буду говорить вы точно, как вы должны разрабатывать свою программу, но я надеюсь, что вы дадите вам лучшее представление о том, как организованы вещи, дает вам лучшее представление в вашем собственном сознании о том, как вы хотите.