当前位置: 首页 > 编程语言 > C#

反思说接口方法在实现类型时是虚拟的,而实际上它们不是?分享

时间:2023-04-10 16:28:49 C#

反思说接口方法在实现类型时是虚拟的,而实际上它们不是?我在单元测试中有以下代码publicboolTestMethodsOf(){varimpl=typeof(T);变种有效=真;foreach(varifaceinimpl.GetInterfaces().Where(i=>typeof(I).IsAssignableFrom(i))){varmembers=iface.GetMethods();foreach(varmemberinmembers){Trace.Write("检查方法"+iface.Name+"."+member.Name+"是虚拟的...");varimplMember=impl.GetMethod(member.Name,member.GetParameters().Select(c=>c.ParameterType).ToArray());如果(!implMember.IsVirtual){Trace.WriteLine(string.Format("FAILED"));有效=假;继续;}Trace.WriteLine(string.Format("OK"));}}返回有效;我称他为Assert.IsTrue(TestMethodsOf());我认为确保接口中的所有方法都声明为虚拟的。原因是因为我正在应用spring.net方面并且它只适用于虚拟方法。我遇到的问题是implMember.IsVirtual始终为真,即使它们未在声明类型中声明。我的TestMethodsOf逻辑有什么问题?干杯在接口中声明的所有方法都标记为虚拟抽象,并且在实现接口方法的类中实现的所有方法都标记为虚拟最终,因此CLR知道它不能直接调用它们-它必须在运行时进行vtable查找才能正确调用执行。接口实现仍然是虚拟的,但您不能覆盖它们,因为它们是最终的。例如,以下C#定义:publicinterfaceIInterface{voidMethod();}publicclassClass:IInterface{publicvoidMethod(){}}编译为以下IL:.classpublicinterfaceabstractIInterface{.methodpublicabstractvirtualinstancevoidMethod(){}}.classpublicClassextends[mscorlib]System.ObjectimplementsIInterface{.methodpublicspecialnamertspecialnameinstancevoid.ctor(){}.methodpublicvirtualfinalinstancevoidMethod(){}}我相信当你实现一个接口时,你从接口继承的方法会被自动标记因为是虚拟的,所以逻辑很好,你不需要测试。以上是C#学习教程:反思接口方法在实现类型中是虚的,什么时候不是?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢