对象引用是非静态字段,方法或属性错误所必需的

时间:2013-06-20 13:39:40

标签: c#

我有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;
}

3 个答案:

答案 0 :(得分:6)

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

public static string getAllExceptNiServiceNames() { ... }

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

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

答案 1 :(得分:2)

我认为Dan的答案可能会解决您当前的问题,但我有点想知道它是否能帮助您快速了解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密切相关,但不仅仅使用它们的一个特定实例 - 或者,如果您以特殊方式创建对象,那么这可能是合适的,就像您在{ {1}}。 (这些可以称为“工厂方法”)。因此,如果您有一个静态方法要对特定对象进行操作,则可以将该方法声明为getServiceNames(),或者在该对象的特定实例上调用该函数(static

所以我不会告诉你应该如何设计你的程序,但我希望能让你更好地了解事情的组织方式,让你在自己的脑海中更好地了解自己的想法。< / p>

答案 2 :(得分: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;
}

这可以解决您的错误。