1

我是一个初学者,已经为我的问题寻找了一个简单的例子,但没有成功。我有两个类,并且想将类对象添加到一个列表中,然后将类中的值打印到控制台。如果之前已经回答过这个问题,我深表歉意。

class onetwo
{

}    
class classOne:onetwo
{
    int item1 = 10;
    int item2 = 11;            
}
class classTwo:onetwo
{
    string item3 = "red";
    string item4 = "blue";
}

class Program
{
    static void Main(string[] args)
    {
        classOne numbers = new classOne();
        classTwo colors = new classTwo();
        List<onetwo> listC1 = new List<onetwo>();
        listC1.Add(numbers);
        listC1.Add(colors);

        foreach (onetwo e in listC1)
        {
            Console.WriteLine(e);
        }

     }
  }
}

//program output is
//objects_added_to_list.classOne
//objects_added_to_list.classTwo
4

1 回答 1

3

ToString您可以为每个类提供方法的重载:

class classOne:onetwo
{
    int item1 = 10;
    int item2 = 11; 

    public override string ToString()
    {
        return string.Format("item1: {0}, item2: {1}", item1, item2);
    }       
}

class classTwo:onetwo
{
    string item3 = "red";
    string item4 = "blue";

    public override string ToString()
    {
        return string.Format("item3: {0}, item4: {1}", item3, item4);
    }       
}

另一种选择是在您的基类中提供一个自定义方法,以通过反射生成格式化字符串:

class onetwo
{
    public virtual string ToPrintableString()
    {
        return string.Join(", ", 
            this.GetType()
                .GetFields()
                .Select(p => p.Name + ": " + p.GetValue(this));
    }
} 

...

foreach (onetwo e in listC1)
{
    Console.WriteLine(e.ToPrintableString());
}

请注意,此方法使用反射,因此速度不是很快(这就是为什么我没有在覆盖中实现它的原因ToString),而且我一般不推荐它,但它适用于您的情况。

于 2013-09-13T03:16:07.173 回答