如何在窗口控制台应用程序中调用非静态方法

时间:2012-07-25 13:12:20

标签: c#

我构建了一个控制台应用程序,我正在尝试测试我的应用程序是否按预期工作 我创建了一个API类的实例,如下面的代码所示,但是我收到一个错误:
An object reference is required for the non-static field.我已经检查了this one之类的类似问题,但似乎有所不同。我究竟做错了什么?

namespace ConsoleApplication1
{
    class Api
    {

        String ConStr = "SERVER=myservername; Database=mydb; UID=mylogin; PWD=mypassword;encrypt=no;enlist=false";
        String bin_Num = "201284-11-000";
        Label lblResults;

        static void Main(string[] args)
        {
            Api Test_api = new Api();
            Test_api.getQualWeight(ConStr, bin_Num, lblResults);
        }

        public Dictionary<String, String> getQualWeight(String sqlConStr, String inBin, Label lblResults)
        {
            Dictionary<String, String> qualList = new Dictionary<string, string>();
            string selectSQL = "select Name,qual_weight from Qualification_type "
                             + "where ID in (select Qualification_ID from Qualifications where BIN = @inBin)";
            con = getConn(sqlConStr);
            SqlCommand cmd = new SqlCommand(selectSQL, con);
            cmd.Parameters.AddWithValue("@inBin", inBin);
            SqlDataReader reader;

            try
            {
                con.Open();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    qualList.Add(reader[0].ToString(), reader[1].ToString());
                }
                reader.Close();
                return qualList;
            }
            catch (Exception err)
            {
                lblResults.Text = "error fetching qualification weight " + err.Message;
                return null;
            }
            finally
            {
                con.Close();
            }
        }
    }
}

5 个答案:

答案 0 :(得分:4)

如果你想使用Object而不是所有成员都是静态的,你需要使用类的实例来引用非静态成员变量。

变化:

Test_api.getQualWeight(ConStr, bin_Num, lblResults);

要:

Test_api.getQualWeight(Test_api.ConStr, Test_api.bin_Num, Test_api.lblResults);

由于ConStrbin_NumlblResults实例变量,因此必须使用该类的实例进行引用 - 在本例中为{{1} }。

或者,您可以通过更改其声明来将这些值移动到全局静态范围中:

Test_api

对此:

String ConStr = "SERVER=myservername; Database=mydb; UID=mylogin; PWD=mypassword;encrypt=no;enlist=false";
String bin_Num = "201284-11-000";
Label lblResults;

答案 1 :(得分:2)

您已将要传递给函数调用的成员声明为实例变量,但您尝试从静态Main方法的范围访问它们。这是不可能的,因为静态Main方法无法访问成员变量。

也可以将它们声明为static,或者使用Test_API.ConStr作为方法的参数。

答案 2 :(得分:1)

您必须将ConStr,bin_Num和lblResults标记为静态。

static String ConStr = "SERVER=myservername; Database=mydb; UID=mylogin; PWD=mypassword;encrypt=no;enlist=false";
static    String bin_Num = "201284-11-000";
static    Label lblResults;

答案 3 :(得分:-1)

更改您的方法签名,如下所示

public static Dictionary<String, String> getQualWeight(String sqlConStr, String inBin, Label lblResults)

答案 4 :(得分:-1)

 public static Dictionary<String, String> getQualWeight

将static关键字放在方法的声明中。