[英]How do I determine the generic type of an implemented interface using reflection?
[英]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.