C#学习教程:如何在基类上调用显式实现的接口方法相同的接口:接口I{intM();}A类:I{intIM(){return1;}}类B:A,I{intIM(){return2;}}派生自IM(),想调用基类实现,但是不知道怎么调用。到目前为止我尝试过的是(在B级):intIM(){return(baseasI).M()+2;}//这给出了一个编译时错误//errorCS0175:使用关键字'base'在此上下文中无效intIM(){return((thisasA)asI).M()+2;}//这会导致无限循环,因为它调用B的实现有没有办法做到这一点而不必实现另一个(非接口显式)辅助方法?更新:我知道可以使用派生类调用的“辅助”方法,例如:classA:I{intIM(){returnM2();}受保护的intM2{返回1;我也可以将其更改为非显式实现接口。但我只是想知道如果没有任何这些解决方法是否可行。不幸的是,这是不可能的。甚至没有辅助方法。helper方法和第二次尝试有同样的问题:this是类型B,B的M实现甚至在基类中被调用:interfaceI{intM();}A类:I{intIM(){return1;}protectedintCallM(){return(thisasI).M();}}B类:A,我{intIM(){returnCallM();唯一的解决方案是A方法中的助手,用于A的M实现:interfaceI{intM();}A类:我{intIM(){returnCallM();}protectedintCallM(){返回1;}}B类:A,我{intIM(){returnCallM();但是你需要为B提供这样一个方法,如果有类C:B,我...你可以使用反射。代码如下所示。我添加了缓存作为基本优化,但可以通过在methodInfo上使用Delegate.CreateDelegate进一步优化methodInfo。此外,可以使用methodInfo.GetParameters()添加参数计数和类型检查。接口I{intM();}A类:I{intIM(){return1;}}类B:A,I{BaseClassExplicitInterfaceInvokerinvoker=newBaseClassExplicitInterfaceInvoker();intIM(){returninvoker.Invoke(this,"M")+2;}}publicclassBaseClassExplicitInterfaceInvoker{privateDictionarycache=newDictionary();私有类型baseType=typeof(T).BaseType;privateMethodInfoFindMethod(stringmethodName){MethodInfo方法=null;if(!cache.TryGetValue(methodName,outmethod)){varmethods=baseType.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);foreach(varmethodInfoinmethods){if(methodInfo.IsFinal&&methodInfo.IsPrivate)//显式接口实现{if(methodInfo.Name==methodName||methodInfo.Name.EndsWith("."+methodName)){method=方法信息;休息;}}}cache.Add(方法名,方法);}返回方法;}publicRTInvoke(Tobj,stringmethodName){MethodInfo方法=FindMethod(方法名);返回(RT)method.Invoke(obj,null);}}//publicstaticclassBaseClassExplicitInterfaceInvoker这是我的灵感来源需要明确吗?...您可以使用抽象类或类而不是接口吗?接口ISample{}A类:ISample{}B类:A{}...基础。乐趣();...http://msdn.microsoft.com/en-us/library/hfw7t1ce(v=vs.71).aspx我不知道当它来自实现时调用基本方法是不可能的界面。您不能在基类中调用显式接口方法,这里我解决了这个问题我有两个接口-->Interface1和Interface2publicinterfaceInterface1{stringmethod2();}publicinterfaceInterface2{stringmethod22();}主类方法类程序{staticvoidMain(string[]args){class1cls=newclass1();字符串str=cls.method2();}}我的接口实现类classclass1:Interface1,Interface2{#regionInterface1Memberspublicstringmethod2(){return(thisasInterface2).method22();}#endregion#regionInterface2成员stringInterface2.method22(){return"2";}#endregion}使用系统;namespaceSampleTest{interfaceIInterface1{void}interfaceIInterface2{voidRun();}publicclassBaseClass:IInterface1,IInterface2{publicvoidInterface1Run(){(thisasIInterface1).Run();}publicvoidInterface2Run(){(thisasIInterface2).Run();}voidIInterface2.Run(){Console.WriteLine("我来自接口2");}voidIInterface1.Run(){Console.WriteLine("我来自接口1");}}publicclassChildClass:BaseClass{publicvoidChildClassMethod(){Interface1Run();Interface2Run();}}publicclassProgram:ChildClass{staticvoidMain(string[]args){ChildClasschildclass=newChildClass();childclass.ChildClassMethod();}}}这是我的RolandPihlakas版本的一个很好的解决方案这个版本支持整个继承链而不是直接基类。Invoke方法包含额外的参数,并且有一个用于非函数的void类型Invoke方法。以上就是C#学习教程的全部内容:如何在基类上调用显式实现的接口方法。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicclassBaseClassExplicitInterfaceInvoker{readonlyDictionaryCache=newDictionary();MethodInfoFindMethod(stringMethodName){if(Cache.TryGetValue(MethodName,outvarResult))returnResult;varBaseType=typeof(T);while(Result==null){if((BaseType=BaseType.BaseType)==typeof(object))中断;varMethods=BaseType.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);结果=Methods.FirstOrDefault(X=>X.IsFinal&&X.IsPrivate&&(X.Name==MethodName||X.Name.EndsWith("."+MethodName)));}if(Result!=null)Cache.Add(MethodName,Result);返回结果;}publicvoidInvoke(TObject,stringMethodName,paramsobject[]Parameters)=>FindMethod(MethodName).Invoke(Object,Parameters);publicReturnTypeInvoke(TObject,stringMethodName,paramsobject[]Parameters)=>(ReturnType)FindMethod(MethodName).Invoke(Object,Parameters);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
