黑马程序员技术交流社区

标题: 反射:如何调用普通类中的带重载的泛型的私有方法? [打印本页]

作者: brucel50    时间: 2013-9-8 07:18
标题: 反射:如何调用普通类中的带重载的泛型的私有方法?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;

  6. namespace 复习
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. Type t1 = typeof(Person);
  13. MethodInfo mi1 = t1.GetMethod("SayHello", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { }, null);
  14. MethodInfo mi2 = t1.GetMethod("SayHello", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(String) }, null);
  15. MethodInfo mi3 = t1.GetMethod("SayHello", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(String), typeof(Int32) }, null);

  16. //如何分别反射以下三个方法?
  17. //private void SayHello<T1, T2, T3>(T1 t1, T2 t2, T3 t3)
  18. //private void SayHello<T1>(T1 t)
  19. //private void GM1<T1>(T1 t)

  20. object obj1 = Activator.CreateInstance(t1);
  21. //开始调用
  22. //
  23. Console.ReadKey();
  24. }
  25. }
  26. class Person
  27. {
  28. private void SayHello()
  29. {
  30. Console.WriteLine("我是一个无参的方法");
  31. }
  32. private void SayHello(string s)
  33. {
  34. Console.WriteLine("我是一个有参的方法,参数:{0}", s);
  35. }
  36. private void SayHello(string s, int i)
  37. {
  38. Console.WriteLine("我是一个有两个参数的方法,参数:{0}、{1}", s, i);
  39. }
  40. private void SayHello<T1, T2, T3>(T1 t1, T2 t2, T3 t3)
  41. {
  42. Console.WriteLine(t1.ToString() + t2.ToString() + t3.ToString());
  43. }
  44. private void SayHello<T1>(T1 t)
  45. {
  46. Console.WriteLine(t.ToString());
  47. }
  48. private void GM1<T1>(T1 t)
  49. {
  50. Console.WriteLine(t.ToString());
  51. }
  52. }
  53. }
复制代码
//如何分别反射以下三个方法?
//private void SayHello<T1, T2, T3>(T1 t1, T2 t2, T3 t3)
//private void SayHello<T1>(T1 t)
//private void GM1<T1>(T1 t)


作者: 段朝骞    时间: 2013-9-29 16:42
本帖最后由 段朝骞 于 2013-9-29 16:45 编辑

利用GetMethods.First()获得你要的结果使用时要先使用MakeGenericMethod指定具体类型,例如: mis1 = mis1.MakeGenericMethod(typeof(string));
  1. static void Main(string[] args)
  2.         {
  3.             Type t1 = typeof(Person);
  4.             MethodInfo mi1 = t1.GetMethod("SayHello", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { }, null);
  5.             MethodInfo mi2 = t1.GetMethod("SayHello", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(String) }, null);
  6.             MethodInfo mi3 = t1.GetMethod("SayHello", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(String), typeof(Int32) }, null);
  7.             MethodInfo[] mis = t1.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance);
  8.             MethodInfo gm1 = t1.GetMethod("GM1", BindingFlags.Instance | BindingFlags.NonPublic);
  9.             //下面这个mis1就是SayHello<T>(T t){} 方法
  10.             MethodInfo mis1 = mis.First(m => m.Name.Equals("SayHello") && m.IsGenericMethod && m.GetGenericArguments().Length == 1); //利用是否为泛型及参数个数来确定具体方法

  11.             gm1 = gm1.MakeGenericMethod(typeof(int));
  12.             mis1 = mis1.MakeGenericMethod(typeof(string));
  13.             //如何分别反射以下三个方法?
  14.             //private void SayHello<T1, T2, T3>(T1 t1, T2 t2, T3 t3)
  15.             //private void SayHello<T1>(T1 t)
  16.             //private void GM1<T1>(T1 t)

  17.             object obj1 = Activator.CreateInstance(t1);
  18.             //开始调用
  19.             //
  20.                 mi3.Invoke(obj1, new object[] { "ss", 1 });
  21.                 gm1.Invoke(obj1,new object[]{1});
  22.                 mis1.Invoke(obj1,new object[]{"T1"});
  23.             Console.ReadKey();
  24.         }
复制代码

作者: 追溯客    时间: 2013-10-14 17:02
楼主你好,如果你的问题已解决请解释,请及时把分类设为已解决,黑马有你更精彩!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2