C#需要传递一个对象,以便另一个类可以调用它';s更新它的方法

C#需要传递一个对象,以便另一个类可以调用它';s更新它的方法,c#,arrays,properties,C#,Arrays,Properties,我有一个类,其中有3个公共列表。它基本上只是一个数据保存类 我有一个带有类似xml的分隔符的文件(某种形式的begging和end标记,以及介于两者之间的数据值) 我有一个parse类,它从数据保存类中检测某些内容并将其添加到特定列表中。基本上,我试图检测一个开始标记,将它存储在我的数据保持类的开始标记列表中 我尝试的方法(基于示例的示例)是Main()将持有数据的类实例化为对象,类似于parse类。然后调用ParseMain来解析文件,并将标记、数据值和结束标记分离到数据保持类中各自的列表中。

我有一个类,其中有3个公共列表。它基本上只是一个数据保存类

我有一个带有类似xml的分隔符的文件(某种形式的begging和end标记,以及介于两者之间的数据值)

我有一个parse类,它从数据保存类中检测某些内容并将其添加到特定列表中。基本上,我试图检测一个开始标记,将它存储在我的数据保持类的开始标记列表中

我尝试的方法(基于示例的示例)是Main()将持有数据的类实例化为对象,类似于parse类。然后调用ParseMain来解析文件,并将标记、数据值和结束标记分离到数据保持类中各自的列表中。然后,在解析类完成之后,回到main,我将调用数据类中的方法来显示数据

我基本上被编译器骂了一顿,因为即使xml data holder类已经在main中实例化了,但它没有或者不能添加到公共列表中,我得到了这个错误

非静态字段、方法或属性需要对象引用

如何从解析类设置数据读取类列表

我的老师给出了一个可怕的例子(除了标记为static的类之外,他什么都有,基本上只是将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);
            }
最后,我的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

}
classxmldoc
{
公共清单要素;
公共列表数据值;
公共列表结束元素;
公共XMLDoc()
{
元素=新列表();
dataValues=新列表();
endingElements=新列表();
}
//此方法仅显示数组的内容
已收集的公共文件()
{
Console.WriteLine(“开始无格式转储”);

对于(int ii=0;iiEDIT):好的,看起来您只需要将引用传递给周围的对象,例如

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)
{
    ...
}
我稍微调整了一下名字,使之更合理


顺便说一句,我建议您不要在
XmlDoc
中使用公共字段。公共字段违反封装-如果您确实需要只公开值,请使用属性,但理想情况下在对象本身中添加更多行为。

编辑:好的,看起来您只需要传递对对象的引用,例如

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)
{
    ...
}
我稍微调整了一下名字,使之更合理


顺便说一句,我建议您不要在
XmlDoc
中使用公共字段。公共字段违反封装-如果您确实需要只公开值,请使用属性,但最好在对象本身中添加更多行为。

这里的错误消息非常好:非静态字段、方法或属性需要对象引用

如果您试图以静态方式调用实例方法,则有两个选项:

  • 使方法保持静态
  • 实例化该类并从实例调用该方法
  • 例如:

    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();
    

    这里的错误消息非常好:“非静态字段、方法或属性需要对象引用”

    如果您试图以静态方式调用实例方法,则有两个选项:

  • 使方法保持静态
  • 实例化该类并从实例调用该方法
  • 例如:

    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();
    

    发布代码的相关部分比描述代码的工作方式要有效得多——尽管描述也很好。我现在要补充一点,但它相当马虎。不管马虎与否,在没有看到代码的情况下很难有效地回答。发布代码的相关部分比描述代码的工作方式要有效得多——尽管ough description也很好。我现在添加,但它非常草率。草率与否,如果没有看到代码,很难有效地回答。属性不可能有3个不同的列表。如果我有1个列表,我只能使用一个属性。我可以为每个列表做一个实际的获取和设置方法,但实际上在一天结束时,没有一个这个程序中的e数据实际上需要封装(它最初是在主类中为实验室编写的,而不是面向对象的)——我的沮丧让我说“去它的,我已经为这个争论了,它要公开了!”!"哈哈,非常感谢你的邀请help@Tyler:为什么你不能有三个不同的属性?@Tyler,你似乎误解了我之前的回答。如果你想控制列表中的内容,你只能选择不使用列表属性。如果你很高兴你的类的客户端向列表中添加/删除项项,你就不能使用列表属性名单(或者完全替换列表,那么属性就可以了。如果您想在添加项目之前检查项目,或者在添加/删除/更改项目时执行其他逻辑,那么您不能公开列表,无论是作为字段还是通过属性。PS您应该开始接受一些问题的答案,因为我理解我t、 由于索引器是如何定义的,我实际上无法将属性(get;set;)用于数组或列表。例如,列表a;和列表b;在同一个类中,但是数组和列表的属性将是public list this[ii]{get;set;}---@Tyler:不,完全可以在数组和列表中使用属性。没有人说你必须使用索引器-你可以编写一个返回列表的属性。属性不可能在3个不同的列表中使用。如果我有1个列表,我只能使用一个属性。我可以为每个列表使用一个实际的获取和设置方法,但是