我有以下类层次结构:

class A {
 /// stuff
}

class B : A {
 /// stuff
}

class C<T> : B {
  /// stuff
}


然后,在完全不同的地方,我有以下三种方法:

public void foo(A a) {
}

// overload 1
public void bar(B b) {
}

// overload 2
public void bar<T>(C<T> ct) {
}


现在,无论出于何种原因,在给定A的实际类型的情况下,我都需要从foo调用“右”栏。也就是说,如果A实际上是B类型,则我需要调用重载1并且如果A实际上是C类型(不管T可能是什么),我都需要调用重载2。为了完整性,如果A既不是B也不是C,则什么也不做。

现在,我正在使用Type类的IsAssignableFrom方法来确定是否可以向上转换为B:

public void foo(A a) {
   if (typeof(B).IsAssignableFrom(a)) {
      bar((B)a);
   }
}


但这也包含C变体。因此,问题是,我该如何执行上流?反射?动力学?我们正在使用.NET 4,因此C#5中引入的任何内容都无法使用。

最佳答案

使用dynamic。它将使方法解析在运行时而不是在编译时发生,因此您将获得最适合实际实例类型的方法。

bar((dynamic)value);

关于c# - 转换为通用类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21294240/

10-12 12:51
查看更多