C # нужно передать объект, чтобы другой класс мог вызывать его методы для его обновления - PullRequest
0 голосов
/ 25 мая 2011

У меня есть класс, в котором есть 3 открытых списка.По сути, это просто класс хранения данных.

У меня есть файл с разделителями типа xml (какие-то теги начала и конца, а также значение данных между ними)

У меня есть класс разбора, который обнаруживает и добавляет определенные вещи в определенные списки из класса хранения данных.В основном я пытаюсь обнаружить открывающий тег, сохраняю его в открывающем теге List в моем классе хранения данных.

Способ, которым я пытаюсь пойти (основываясь на плохом извинении учителя для примера),Main () создает экземпляр класса хранения данных в объекте, аналогично классу разбора.Затем он вызывает ParseMain для анализа файла и разделения тегов, значений данных и закрывающих тегов на их соответствующие списки внутри класса хранения данных.Затем, после того, как класс Parse закончен, вернемся в main, я вызываю методы внутри класса данных для отображения данных.

В основном на меня кричит компилятор, потому что, хотя данные xmlКласс держателя был создан в main, но не может или не может быть добавлен в публичный список. Я получаю именно эту ошибку

«Ссылка на объект требуется для нестатического поля, метода или свойства»

Как установить классы чтения данных List из моего класса разбора?

Мой учитель привел ужасный пример (у него все, кроме классов, помеченных как статические, и в основном просто вставил код стиля java / c ++ в пару классов)

Это дополнительный балл за базовыйКласс программирования, в котором я учусь. (нормальная версия полностью структурная внутри одного класса)

*** Правка - добавление фрагментов кода

                    XMLDoc XMLData = new XMLDoc();
                    XMLParse parseXML1 = new XMLParse();


                    //Calls the parseXML1 method passing it
                    //the name of the currently opened file.
                    parseXML1.MainParse(fileIn);

затем в мой основной анализ

    public void MainParse(FileStream fileIn)
    {

        int byteIn;


        while ((byteIn = fileIn.ReadByte()) != -1)
        {

            if (byteIn == '<')
            {
                ParseElement(ref byteIn,fileIn);
            }

ParseElement выглядит как

    public void ParseElement(ref int byteIn,FileStream fileIn)
    {
        token += byteIn;
        //First I need to get the entire tag stored in token
        do
        {        
            byteIn = fileIn.ReadByte();
            token += byteIn;
        } while (byteIn != '>');
        token += '>';

        //now I insert a / into my compare token
        compareToken = token;
        compareToken.Insert(1,"/");

        //It's an ending tag
        if (token == compareToken)
        {
            //figure this out later
        }
        //It's an opening tag,store it into element list
        else
        {
            XMLDoc.elements.Add(token);
            //also tried XMLData/elements/Add(token)
        }

    }

и, наконец, мой класс XMLDoc выглядит так ...

class XMLDoc
{
    public List<string> elements;
    public List<string> dataValues;
    public List<string> endingElements;

    public XMLDoc()
    {
        elements = new List<string>();
        dataValues = new List<string>();
        endingElements = new List<string>();
    }

    //This method simply displays the contents of the arrays
    public void DisplayCollected()
    {
        Console.WriteLine("Begin unformatted dump");
        for (int ii = 0; ii <= elements.Count;ii++)
        {
            Console.WriteLine("\n"+elements[ii]+dataValues[ii]+
                "\n"+endingElements[ii]);
        }
        Console.WriteLine("End unformatted dump\n");
    }

    //This method will generate an xml style display
    //To add later

}

Я играю, учусь на практике и тому подобное.В этот момент мне пришлось отказаться от примера учителя, как уже упоминалось выше, он просто сделал каждый метод в каждом классе статичным, возможно, потому, что он собрал свой пример вместе с основной лабораторной работой (которая является структурной и все внутри первого класса)

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

РЕДАКТИРОВАТЬ: Хорошо, похоже, вам просто нужно передать ссылку на объект вокруг, например,

XmlDoc xmlData = new XmlDoc();
XmlParser parser = new XmlParser();
parser.MainParse(xmlData, fileIn)

...

public void MainParse(XmlDoc xmlData, FileStream fileIn)
{
    ...
    ParseElement(xmlData, ref byteIn, fileIn);
    ...
}

public void ParseElement(XmlDoc xmlData, ref int byteIn,FileStream fileIn)
{
    ...
}

Я немного подкорректировал имена, чтобы сделать их более понятными IMO.* Я бы рекомендовал вам не использовать публичные поля в XmlDoc, кстати.Открытые поля нарушают инкапсуляцию - используйте свойства, если вам действительно нужно просто выставить значения, но в идеале лучше настроить поведение самого объекта.

1 голос
/ 25 мая 2011

Здесь довольно хорошее сообщение об ошибке: "Ссылка на объект требуется для нестатического поля, метода или свойства"

Вы пытаетесь вызвать метод экземпляра в статическом режиме, у вас есть два варианта:

  1. Сделать метод статическим.
  2. Создание экземпляра класса и вызов метода из экземпляра.

Например:

public class Foo()
{
    public void Frob() {}
}

Вы не можете сделать это:

Foo.Frob();

Но вы можете сделать это:

var foo = new Foo();
foo.Frob();

или это:

public class Foo()
{
    public static void Frob() {} // Note static
}

[...]

Foo.Frob();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...