接口的显式实现,需要转为接口来调用.如下图,该方法不仅是私有的,而且是虚类型的。
反射无法取到私有方法,所以也就无法通过反射该类来调用显式实现方法。此时可以考虑使用接口类型反射来调用。
在多接口继承,并且接口多层次时,需要弄清楚最终实现的类到,是否多次包含最顶层接口的方法
例如B继承A,C继承A,而D继承B,C, 此时D是实现一个A还是两个A,答案是一个A。
也就是D的实现,不是实现B中A的方法,跟C中A的方法,而是分别实现,A,B,C所定义的方法。
1 public interface ISpeakor 2 { 3 void Speak(); 4 } 5 public interface IBoySpeakor:ISpeakor 6 { 7 void Do(); 8 } 9 public interface IGirlSpeakor : ISpeakor 10 { 11 void Do(); 12 } 13 // 反射调用 14 public class Speaker : IBoySpeakor, IGirlSpeakor 15 { 16 //方法前面 不加public 17 void IBoySpeakor.Do() 18 { 19 Console.WriteLine("BoySpeakor.Do()"); 20 } 21 22 void IGirlSpeakor.Do() 23 { 24 Console.WriteLine("GirlSpeakor.Do()"); 25 } 26 27 void ISpeakor.Speak() 28 { 29 Console.WriteLine("Speakor.Speak()"); 30 } 31 public void Do() 32 { 33 Console.WriteLine("this.Do()"); 34 } 35 public void Speak() 36 { 37 Console.WriteLine("this.Speak()"); 38 } 39 private void DD() 40 { 41 } 42 public static void Test() 43 { 44 Speaker sp=new Speaker(); 45 IBoySpeakor boy=sp; 46 IGirlSpeakor girl=sp; 47 48 sp.Speak(); 49 boy.Speak(); 50 girl.Speak(); 51 ((ISpeakor)sp).Speak(); 52 ((IBoySpeakor)sp).Speak(); 53 ((IGirlSpeakor)sp).Speak(); 54 55 56 Console.WriteLine(); 57 sp.Do(); 58 boy.Do(); 59 girl.Do(); 60 ((IBoySpeakor)sp).Do(); 61 ((IGirlSpeakor)sp).Do(); 62 63 Console.WriteLine(); 64 65 var ms=sp.GetType().GetMethods(); 66 foreach (var m in ms) 67 Console.WriteLine(m.Name); 68 69 Console.WriteLine(); 70 var fs=sp.GetType().GetInterfaces(); 71 foreach (var f in fs) 72 Console.WriteLine(f.Name); 73 74 typeof(IBoySpeakor).GetMethod("Do").Invoke(sp, null); 75 //出错 76 //typeof(IBoySpeakor).GetMethod("Speak").Invoke(sp, null); 77 typeof(ISpeakor).GetMethod("Speak").Invoke(sp, null); 78 79 } 80 }