在foreach循环中调用派生类方法

时间:2013-09-24 02:03:07

标签: c# oop foreach var

我遇到了这段代码的问题:

List<Person> persons;    

foreach(var p in persons)
    p.Save();

有几个派生自Person的类,所有类都有自己的new Save()方法。不幸的是,上面的代码只调用基类的save方法,尽管列表包含不同类型的实例(基类和派生类)。

所有派生类都包含所有基类'字段,只有Save方法不同,因此它还保存派生类'字段。

如何根据当前迭代的变量类型调用适当的Save方法?

3 个答案:

答案 0 :(得分:6)

方法隐藏通常是灾难的一个方法。正确实现此方案会在Save()类中将virtual声明为Person,在派生类中将其override声明为。{/ p>

如上所述,要使其适用于您的情况,您需要将p强制转换为相应的派生类,并在其上调用Save()。根据您对对象的了解或不了解,您可能需要动态确定派生类型并使用反射调用其Save()方法。

答案 1 :(得分:1)

另一种方式,使用反射

List<Person> persons;    

foreach(var p in persons)
    p.GetType().GetMethod("Save").Invoke(p, null);

反射位慢如果你可以将save方法的声明更改为虚拟,并在其他类中覆盖它,这将是比lc的答案更好的选择。

答案 2 :(得分:0)

这会调用正确的方法。

using System;

namespace Inheritance
{
    class Program
    {
        public class Person
        {
            virtual public void Save()
            {
                Console.WriteLine("Person Save");
            }
        }
        public class Emp : Person
        {
            override public void Save() {
                Console.WriteLine("Emp Save");
            }
        }
        static void Main(string[] args)
        {
            Person p = new Emp();
            p.Save();
        }
    }
}