c# - 反射说接口(interface)方法在实现类型中是虚拟的,而实际上它们不是?

标签 c# reflection virtual spring.net

我在单元测试中有以下代码

    public bool TestMethodsOf<T, I>()
  {
   var impl = typeof(T);
   var valid = true;

   foreach (var iface in impl.GetInterfaces().Where(i => typeof(I).IsAssignableFrom(i)))
   {

    var members = iface.GetMethods();

    foreach (var member in members)
    {
     Trace.Write("Checking if method " + iface.Name + "." + member.Name + " is virtual...");
     var implMember = impl.GetMethod(member.Name, member.GetParameters().Select(c => c.ParameterType).ToArray());
     if (!implMember.IsVirtual)
     {
      Trace.WriteLine(string.Format("FAILED"));
      valid = false;
      continue;
     }

     Trace.WriteLine(string.Format("OK"));
    }
   }
   return valid;
  }

我调用

Assert.IsTrue(TestMethodsOf<MyView, IMyView>());

我想确保接口(interface)中的所有方法都声明为虚拟的。原因是因为我正在应用 spring.net 方面,它只适用于虚拟方法。

我遇到的问题是 implMember.IsVirtual 始终为真,即使它们未在声明类型中声明为真。

我的 TestMethodsOf 逻辑有什么问题?

干杯

最佳答案

所有在接口(interface)中声明的方法都被标记为virtual abstract,所有在类中实现接口(interface)方法的方法都被标记为virtual final,所以CLR知道它可以'直接调用它们 - 它必须在运行时进行 vtable 查找以调用正确的实现。接口(interface)实现仍然是虚拟的,但您不能覆盖它们,因为它们是最终的。

例如,以下 C# 定义:

public interface IInterface {
    void Method();
}

public class Class : IInterface {
    public void Method() {}
}

编译为以下 IL:

.class public interface abstract IInterface {
    .method public abstract virtual instance void Method() {}
}

.class public Class extends [mscorlib]System.Object implements IInterface {
    .method public specialname rtspecialname instance void .ctor() {}
    .method public virtual final instance void Method() {}
}

关于c# - 反射说接口(interface)方法在实现类型中是虚拟的,而实际上它们不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37935538/

相关文章:

c++ - 应该接受不同输入参数的纯虚函数——应该如何实现?

c++ - 带有模板化访客的访客模式

c# - 策略模式与多态有何不同?

c# - ASP.NET Web API 本地主机 :xxxx/api/product defaults to Home Page and not JSON data(orXML)

c# - 使用 DataBinding 更新标签

c# - 如何将类对象转换为字符串?

c# - 仅在需要时返回字符串的共享方法

reflection - 如何检查方法镜像是否实现typedef

java - Java注解顺序是否持久?

C++ : implications of making a method virtual