在基类集合上调用派生方法

Omi*_*ron 5 c# polymorphism casting covariance

我有一个名为A的抽象类,以及实现A的其他类(B,C,D,E,...).我的派生类包含不同类型的值.我还有一个A对象列表.

    abstract class A { }
    class B : class A
    {
      public int val {get;private set;}
    }
    class C : class A
    {
      public double val {get;private set;}
    }
    class D : class A
    {
      public string val {get;private set;}
    }

    class Program
    {
        static void Main(string[] args)
        {
          List list = new List { new B(), new C(), new D(), new E() };
          // ... 

          foreach (A item in list)
          {
            Console.WriteLine(String.Format("Value is: {0}", item.val);
          }
        }
    }
Run Code Online (Sandbox Code Playgroud)

...其中.val不为基类ofc所知.

我怎样才能获得这种动态行为?我不想在long switch/if-statements中使用getType.

小智 2

尝试这个:

using System;
using System.Collections.Generic;

abstract class A
{
    public abstract dynamic Val { get;   set; }

}
class B : A
{
    public override dynamic Val { get;  set; }
}
class C : A
{
    public override dynamic Val { get;  set; }
}
class D : A
{
    public override dynamic Val { get;  set; }
}

class Program
{
    static void Main(string[] args)
    {
        var list = new List<A> { new B(), new C(), new D() };
        // ... 

        foreach (A item in list)
        {
            Console.WriteLine(String.Format("Value is: {0}", item.Val));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)