Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反射说接口方法在实现类型中是虚拟的,而不是虚拟的?_C#_Reflection_Virtual_Spring.net - Fatal编程技术网

C# 反射说接口方法在实现类型中是虚拟的,而不是虚拟的?

C# 反射说接口方法在实现类型中是虚拟的,而不是虚拟的?,c#,reflection,virtual,spring.net,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(); f

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

    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>());
我想确保接口中的所有方法都声明为虚拟的。原因是我正在应用一个spring.net方面,它将只应用于虚拟方法

我遇到的问题是implemember.IsVirtual始终为true,即使它们在声明类型中没有声明为true

我的逻辑测试方法有什么问题


干杯

我相信当你实现一个接口时,你从接口继承的方法会自动标记为虚拟的,所以逻辑很好,你不需要测试。

接口中声明的所有方法都标记为虚拟抽象,所有在类中实现接口方法的方法都被标记为virtualfinal,因此CLR知道它不能直接调用它们——它必须在运行时进行vtable查找才能调用正确的实现。接口实现仍然是虚拟的,但您不能覆盖它们,因为它们是最终的

例如,以下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() {}
}

如果我试图重写声明类型中的方法,我就不能这样做。此外,本例中的继承方面没有覆盖我的方法调用,因此也没有将它们检测为virtualexcellent!所以我把代码改为检查IsFinal而不是IsVirtual,现在它可以正常工作了。谢谢