自动转换为派生类型而不检查派生类型?

时间:2018-05-14 04:54:21

标签: c# inheritance casting

我有一个类型列表,它是不同派生类型的集合。例如:

A
B:A
C:A
D:A

所以列表中有B,C,D

现在我想将列表自动转换为其派生类型并在其中调用方法。

虽然这个例子很简短,但是我希望在没有检查的情况下自动转换为派生类型的原因是为了避免冗长的if / else之类的东西,比如

if(item[i] is B) (B).Process();
else if(item[i] is C) (C).Process();
// etc etc etc

当你有一个复杂的派生类型设置时,这会变得有点乏味。

C#是否有某种方法可以自动转换为各自的highest derived type?或者我每次都坚持检查?

1 个答案:

答案 0 :(得分:1)

使用界面,

    internal interface IProcess
    {
        void Process();
    }
    class AA
    {
    }
    class BB : AA, IProcess
    {
        public void Process() { Console.WriteLine($"Inside: {nameof(BB)}"); }
    }
    class CC : AA, IProcess
    {
        public void Process() { Console.WriteLine($"Inside: {nameof(CC)}"); }
    }
    class DD : AA, IProcess
    {
        public void Process() { Console.WriteLine($"Inside: {nameof(DD)}"); }
    }

简单地迭代,

     var listWithInterface = new List<IProcess> { new BB(), new CC(), new DD() };
     foreach (var item in listWithInterface)
     {
           item.Process();
     }

另一种方法可能是使用虚方法,

class A
    {
        public virtual void Process() { }
    }
    class B : A
    {
        public override void Process() { Console.WriteLine($"Inside: {nameof(B)}"); }
    }
    class C : A
    {
        public override void Process() { Console.WriteLine($"Inside: {nameof(C)}"); }
    }
    class D : A
    {
        public override void Process() { Console.WriteLine($"Inside: {nameof(D)}"); }
    }

并使用它,

var list = new List<A> { new B(), new C(), new D() };
            foreach (var item in list)
            {
                item.Process();
            }