我在单元测试中有以下代码
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始终为true。
我的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# - 反射(reflection)说接口(interface)方法在实现类型中是虚拟的,不是吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4793213/