3

上記のエラーが発生します。このエラーに関する他の同様の投稿を見ましたが、問題がどこにあるのかわかりません。クラスの型を static に変更したところ、エラーが発生しなくなりました。これは、メイン フォーム クラスのコード全体です。

クラスを編集しました。これは現在のように見え、エラーは次のように変更されました。この型の別の部分宣言が存在します。

namespace PhoneFind
{
    public partial class frmMain : Form
    {
        // the path to the temporary file to store the webresponse
        String path = "c:\\Temp\\webresponse.txt";
        public frmMain()
        {
            InitializeComponent();
            comboSelectSearchEngine.SelectedIndex = 0;
            ofdPhones.Filter = "txt files (*.txt)|*.txt";
            listbxMessages.Items.Clear();
            addItemToListBox(listbxMessages, "Welcome to ActionBase Phone Find!");
            addItemToListBox(listbxMessages, "Select the file containing the numbers.");
            radioNumbers.Checked = true;
        }

        private void frmMain_Load(object sender, EventArgs e)
        {

        }

        private void btnLoadFile_Click(object sender, EventArgs e)
        {
            if (ofdPhones.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtFile.Text = ofdPhones.FileName;

                // Read the file line by line and add the numbers to the numbers listbox.
                listbxNumbers.Items.Clear();
                String line;
                int numbersCounter = 0;
                System.IO.StreamReader file = new System.IO.StreamReader(ofdPhones.FileName);
                while ((line = file.ReadLine()) != null)
                {
                    listbxNumbers.Items.Add(line.Trim());
                    numbersCounter++;
                }
                addItemToListBox(listbxMessages, ofdPhones.FileName + " loaded.");
                addItemToListBox(listbxMessages, numbersCounter + " records found in the file.");

            }
        }

        // add item to the listbox and move scroll to the end of the listbox for the latest messages to be visibile to the viewer
        private void addItemToListBox(ListBox listbox, String item)
        {
            listbox.Items.Add(item);
            listbox.SelectedIndex = (listbox.Items.Count - 1);
        }

        private void radioNumbers_CheckedChanged(object sender, EventArgs e)
        {
            if (!radioNumbers.Checked)
            {
                grpbxNumbers.Text = "Names and Addresses";
            }
            else
            {
                grpbxNumbers.Text = "Numbers";
            }
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            if (listbxNumbers.Items.Count == 0)
            {
                MessageBox.Show("No records have been loaded." + "\n" + "Use the browse button to load records.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (!CheckForInternetConnection())
            {
                MessageBox.Show("No internet connection.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                String response;
                switch (comboSelectSearchEngine.SelectedIndex)
                {
                    case 0: // Hitta.se
                        foreach (String item in listbxNumbers.Items)
                        {
                            WebRequestObj request = new WebRequestObj(item, "hitta");
                            response = request.sendRequest();
                            if (response.Equals("Error"))
                            {
                                addItemToListBox(listbxMessages, "Error sending '" + item + "' to the server.");
                            }
                            else
                            {
                                //create a temporary file to work on the response
                                StreamWriter sw;
                                if (!File.Exists(path)) {
                                    sw = File.CreateText(path);
                                }
                                try
                                {
                                    File.WriteAllText(path, String.Empty); // clear the content of the file
                                    sw = File.AppendText(path);
                                    sw.WriteLine(response);
                                    sw.Flush();
                                    sw.Close();
                                    String s = findResultType(path);
                                    MessageBox.Show(s);
                                }
                                catch (IOException ioe)
                                {
                                    MessageBox.Show(ioe.Message,"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }


                            }
                        }
                        break;
                }
            }
        }

        public bool CheckForInternetConnection()
        {
            try
            {
                using (var client = new System.Net.WebClient())
                using (var stream = client.OpenRead("http://www.google.com"))
                {
                    return true;
                }
            }
            catch
            {
                return false;
            }
        }

        /*
         * findResultType
         * gets the web response and finds out if the matching result of the search termis one of the following:
         * 1. one person (oneperson)
         * 2. one company (onecompany)
         * 3. more than one person, no company (manypersonnocompany)
         * 4. no person, more than one company (nopersonmanycompany)
         * 5. more than one person, more than one company (manypersonmanycompany)
         * 6. no person, no company (nopersonnocompany)
         */
        public String findResultType(String reponsepath)
        {                   
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.Load(reponsepath);
            List<String> itemList = new List<String>();
            IEnumerable<String> v = null;
            var item = doc.DocumentNode.SelectNodes("//body[@id='person']");

            if (item != null)
            {
                v = item.Select(p => p.InnerText);
                itemList = v.ToList();
                if (itemList.Count == 1)
                    return "oneperson";
            }
            else
            {
                item = doc.DocumentNode.SelectNodes("//body[@id='company']");
                if (item != null)
                {
                    v = item.Select(p => p.InnerText);
                    itemList = v.ToList();
                    if (itemList.Count == 1)
                        return "onecompany";
                }
            }

            //for (int i = 0; i < itemList.Count; i++)
            //{
            //    MessageBox.Show(itemList[i]);
            //    //console.writeline(itemlist[i]);
            //}
            //console.writeline(itemlist.count + " results found.");
            return "";
        }
    }
}
4

3 に答える 3

11

これがあなたの最初の問題です:

public static class frmMain : Form

別のクラスから静的クラスを派生させることはできません。静的クラスは常に暗黙的にから派生しObjectます。また、静的クラスに非静的メンバーを含めることはできません。

したがって、基本的に、拡張メソッドをクラスに配置することはできませんfrmMain(.NETの命名規則に従い、同時にもう少しわかりやすくするために、名前を変更する必要があります)。とにかく拡張メソッドをそのクラスに入れたいのはなぜですか?

投稿したコードに拡張メソッドが表示されません。削除しましたか?あなたが投稿していない他のクラスにありますか?

基本的に、一歩後退する必要があると思います。コンパイラのエラーメッセージを完全に理解せずに反応したようです。フォームクラスを静的にしたくない理由と、拡張メソッドを含むクラスを静的にしたい理由を本当に理解するまで、拡張メソッドを読み、静的クラスとは何かを読みます。

于 2012-11-07T16:07:33.340 に答える
1

クラスにパブリック コンストラクターを含めるstaticことはできません。さらに、static表示するにはフォームのインスタンスが必要なため、フォームは無意味です。

拡張メソッドがある場合 (何も表示されません...)、staticインスタンスを作成できない別のクラスに移動する必要があります。

static class MyExtensions
{
  public static void Extend(this Object o) {}
}
于 2012-11-07T16:10:10.827 に答える
0

拡張メソッドは常に別の静的クラスに配置する必要があります。

クラスを静的としてマークするだけでは問題を解決できません。それはクラスの全体的な意味を変えます。代わりに、拡張メソッドだけの新しいクラスを作成してください。

例えば:

public static class Extensions
{
    public void SomeExtension(this object arg)
    {
        ...
    }
}
于 2012-11-07T16:10:53.097 に答える