C#:具有非多态类的动态多态

Ber*_*ron 3 c# inheritance dynamic

我有一组我没写过的课程,而且它们只读.让我们说,例如,这些类是以下类:

public class Base { }
public class B : Base { }
public class C : B { }
public class D : Base { }
Run Code Online (Sandbox Code Playgroud)

我想Foo()在所有这些类上添加一个方法,我正在使用扩展方法:

public static class Extensions {

  public static void Foo(this Base obj) {
      dynamic dynobj = obj;
      try {
        dynobj.Foo();
      }
      catch (RuntimeBinderException ex) {
          Console.WriteLine(ex.Message);
      }
  }

  public static void Foo(this B b) {
      Console.WriteLine("Foo in B");
  }

  public static void Foo(this C c) {
      Console.WriteLine("Foo in C");
  }

}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在尝试使用该关键字dynamic,期望它知道我的对象的真实类型并调用它的Foo()方法.但是...... dynobj.Foo()总是失败.

static void Main(string[] args) {
    List<Base> list = new List<Base>();
    list.Add(new B());
    list.Add(new C());
    list.Add(new D());

    list.ForEach(x => x.Foo());
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用适配器模式,但我真的有太多的类.

这样做是一个好主意dynamic吗?是否有可能使这项工作?

谢谢.

Bri*_*sio 5

这是因为Foo永远不会被添加为方法.扩展方法仍然只是静态类中的静态方法,实际上并不直接与所讨论的类相关联.它们不像混合物(红宝石).编译器只是将对象上看起来像调用的内容转换为静态方法.

与呼叫相同: Extensions.Foo(thing)

我最好的建议是创建一个查找表(Dictionary),您可以注册不同版本的Foo.

也许是这样的(未经测试的)?

public static class Extensions {

  private static Dictionary<Type, Action<Base>> callFoo = new Dictionary<Type, Action<Base>>
  {
    {typeof(B), b => (b as B).Foo()},
    {typeof(C), b => (b as C).Foo()}
  };

  public static void Foo(this Base obj) {
      try {
        callFoo[typeof(obj)](obj);
      }
      catch (RuntimeBinderException ex) {
          Console.WriteLine(ex.Message);
      }
  }

  public static void Foo(this B b) {
      Console.WriteLine("Foo in B");
  }

  public static void Foo(this C c) {
      Console.WriteLine("Foo in C");
  }

}
Run Code Online (Sandbox Code Playgroud)