[英]Reflection says that interface method are virtual in the implemented type, when they aren't?
I have the following code in an unit test 我在单元测试中有以下代码
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;
}
which I call by 我称之为
Assert.IsTrue(TestMethodsOf<MyView, IMyView>());
I want to ensure that all the methods from the interface are declared as virtual. 我想确保接口中的所有方法都声明为虚拟方法。 The reason is because I'm applying a spring.net aspect and it will only apply to virtual methods.
原因是因为我正在应用spring.net方面,它将仅适用于虚拟方法。
The problem I'm having is that implMember.IsVirtual is always true, even when they are not declared as so in the declaring type. 我遇到的问题是,即使在声明类型中未声明为implMember.IsVirtual始终为true。
What is wrong with my TestMethodsOf logic? 我的TestMethodsOf逻辑有什么问题?
Cheers 干杯
All methods declared in an interface are marked as virtual abstract
, and all methods that implement interface methods in classes are marked as virtual final
, so the CLR knows it can't just call them directly - it has to do vtable lookups at runtime to call the right implementation. 接口中声明的所有方法都标记为
virtual abstract
,而所有在类中实现接口方法的方法都标记为virtual final
,因此CLR知道它不能直接调用它们-它必须在运行时进行vtable查找才能调用正确的实施。 The interface implementations are still virtual, but you can't override them as they're final. 接口实现仍然是虚拟的,但是您不能覆盖它们,因为它们是最终的。
As an example, the following C# definition: 例如,以下C#定义:
public interface IInterface {
void Method();
}
public class Class : IInterface {
public void Method() {}
}
compiles to the following IL: 编译为以下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.