1

I have 2 existing functions. One I can't edit (getServiceNames) and in the second I need to set a string (getDataTableOne). I want to set this string with a function in the same class (getAllExceptNiServiceNames) but he gives me this error because my function i would like to edit is static.

An object reference is required non-static field, method, or property 'Queries.getAllExceptNiServiceNames()'

I can't remove the static property of the function and I also can't make a string object. Whats the best way to fix this?

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;
}
4

3 回答 3

6

您需要将您的方法声明为静态:

public static string getAllExceptNiServiceNames() { ... }

或者在使用该方法之前创建您的类的一个实例:

var q = new Queries();
string serviceNameFilterLineThree = q.getAllExceptNiServiceNames();
于 2013-06-20T13:41:16.457 回答
2

我认为丹的回答可能会解决您当前的问题,但我想知道它是否可以帮助您快速了解static运算符的含义;这让我在 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方法是不绑定到任何单个对象的方法。如果您有一个与 Accounts 密切相关的操作,但不只使用它们的一个特定实例,这可能是合适的 - 或者,如果您以一种特殊的方式创建一个对象,就像您在getServiceNames(). (这些可以称为“工厂方法”)。因此,如果您有一个要对特定对象进行操作的静态方法,您可以将该方法声明为static,或者在该对象的特定实例上调用该函数 ( oneObject.myFunction())

所以我不会确切地告诉你应该如何设计你的程序,但我希望让你更好地了解事物是如何组织的,让你更好地了解你想要的方式。

于 2013-06-20T13:55:58.283 回答
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;
}

这可能会解决您的错误。

于 2013-06-20T13:44:25.860 回答