首页 > 解决方案 > C#:让编译器在从 IEnumerable 读取多态对象时调用正确的方法重载

问题描述

我有一个IEnumerable<BaseClass>可能包含一些类型的对象SubClassOfBaseClass。我还有一个带有 2 个重载的重载方法,每个都采用 BaseClass 或 SubClassOfBaseClass。

当我遍历IEnumerable并调用每个成员的重载方法,将成员作为参数传递给它时,它总是调用用于 BaseClass 的重载,而不是 SubClassOfBaseClass。

有没有一种优雅的方法可以让它调用正确的重载 - 然后手动检查 IEnumerable 的每个成员并将其归类为正确的类型?

示例代码:

public class BaseClass {

}

public class SubClassOfBaseClass : BaseClass {

}

public class Program {
    private static void Method(BaseClass item) {
        Console.WriteLine("base class!");
    }

    private static void Method(SubClassOfBaseClass item) {
        Console.WriteLine("sub class!");
    }

    public static void Main(string[] args) {
        var items = new List<BaseClass>();
        items.Add(new BaseClass());
        items.Add(new SubClassOfBaseClass());

        foreach (var item in items) {
            Method(item);
        }
    }
}

结果输出将是:

base class!
base class!

...但我需要它

base class!
sub class!

标签: c#

解决方案


我试图将其发布到评论部分,但我没有这样做的权限。

但是,这是一个可行的解决方案:

根据dynamic-MSDN,尽量避免使用var-的迭代dynamic

foreach (dynamic item in items) {
        Method(item);
    }

希望有帮助。祝你好运!


推荐阅读