0

我收到一个错误“非静态字段、方法或属性‘Excel1.Program.GetAllTemplateNames(string, string)’需要对象引用”我知道这很愚蠢,但我对 C# 很陌生,可以做在调试此代码时提供一些帮助。甚至可以从 Main 函数调用静态函数吗?我有这些疑问。

4

5 回答 5

4

由于是静态的,如果没有此类 () 的实例,则无法从那里ProcessInput调用实例(非静态)方法。GetAllTemplateNamesProgram

因此,您要么需要制作GetAllTemplateNames静态,要么需要制作ProcessInput非静态。我会选择第二个选项,因为GetAllTemplateNames需要访问一些实例变量,这在静态时是不可能的。

ProcessInput所以通过以下方式更改签名(注意省略static):

public void ProcessInput(String strRetVal, String strFunctionName, /*String strParamCount,*/ String strParam1, String strParam2, String strParam3, String strParam4)

现在您还需要将此方法的调用更改main为:

var p = new Program();  // create an instance
p.ProcessInput(strRetVal, strFunctionName, /*strParamCount,*/ strParam1, strParam2, strParam3, strParam4);

MSDN:静态

于 2012-06-18T09:50:58.570 回答
3

如果您希望能够在没有类实例的情况下从其他静态方法调用它,则应该创建该GetAllTemplateNames方法:static

public static void GetAllTemplateNames(String strParam, String strRetVal)

这也意味着此方法使用的字段(templateClient并且taskClient也必须是静态的)

或者另一种可能性是创建包含类的实例:

new Program().GetAllTemplateNames(strParam1, strRetVal);
于 2012-06-18T09:45:20.647 回答
2

更改此行

      GetAllTemplateNames(strParam1, strRetVal);

      new Program().GetAllTemplateNames(strParam1, strRetVal);

或使方法静态。

于 2012-06-18T09:45:48.057 回答
2

问题发生在线路上,以及对或的GetAllTemplateNames(strParam1, strRetVal);任何其他呼叫。GetAllTemplateNames()ReturnAllTemplateNames()

这些方法不是静态的,但您是从静态方法调用它们!您需要将它们设为静态,或创建它们的包含类的实例,以便从静态方法(如main().

于 2012-06-18T09:46:20.613 回答
1

主要功能是静态的,这就是您可以调用 ProcessInput 的原因。但是,您不能从静态函数调用非静态函数:GetAllTemplateNames 必须是静态函数。

于 2012-06-18T09:55:47.147 回答