簡體   English   中英

反思說接口方法在實現類型中是虛擬的,不是嗎?

[英]Reflection says that interface method are virtual in the implemented type, when they aren't?

我在單元測試中有以下代碼

    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方面,它將僅適用於虛擬方法。

我遇到的問題是,即使在聲明類型中未聲明為implMember.IsVirtual始終為true。

我的TestMethodsOf邏輯有什么問題?

干杯

接口中聲明的所有方法都標記為virtual abstract ,而所有在類中實現接口方法的方法都標記為virtual final ,因此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() {}
}

我相信當您實現接口時,從該接口繼承的方法會自動標記為虛擬,因此邏輯很好,並且不需要測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM