我有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;
}
答案 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;
}
这可以解决您的错误。