接口 显式实现 反射

接口的显式实现,需要转为接口来调用.如下图,该方法不仅是私有的,而且是虚类型的。

反射无法取到私有方法,所以也就无法通过反射该类来调用显式实现方法。此时可以考虑使用接口类型反射来调用。

在多接口继承,并且接口多层次时,需要弄清楚最终实现的类到,是否多次包含最顶层接口的方法

例如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     }

 

原文地址:https://www.cnblogs.com/AspDotNetMVC/p/2932507.html