使用反射检索类的私有方法

时间:2010-09-13 10:34:19

标签: asp.net .net vb.net reflection copy

我想检索实现接口的类的私有(实现和其他)方法,并且也是从(继承)基类派生的。

  1. 如何使用反射实现此目的?
  2. 还有另一种方法可以达到这个目的吗?
  3. 这就是我想要做的。我需要查看这些私有方法及其内容。我不想调用它们。

    Dim assembly As System.Reflection.Assembly 
    Dim assemblyName As String assemblyName = System.IO.Path.GetFullPath("xyz.dll") 
    assembly = System.Reflection.Assembly.LoadFile(assemblyName) 
    
    assembly.GetType("myClass").Getmethods(Bindings.NonPublic)
    

    assembly.GetType("myClass").GetMethods(BindingFlags.NonPublic)无效。

3 个答案:

答案 0 :(得分:3)

假设您正在尝试使用第三方程序集的私有方法:

我要求谨慎使用私人方法,因为某种原因而将其私有化 可能依赖某些你无法预料的状态;此外,如果将来更新程序集,可能会更改或删除私有行为,导致您必须重新编写代码以进行补偿。

但是,如果您想继续,可以使用两种方法。 我们在.net 4中使用新的Dynamic关键字的一种方式:

http://igoro.com/archive/use-c-dynamic-typing-to-conveniently-access-internals-of-an-object/

要使用反射,这个问题可能会对您有所帮助:

How do I use reflection to invoke a private method?

希望这有帮助。

答案 1 :(得分:1)

BindingFlags

您必须指定实例静态以及Public或NonPublic,否则将不会返回任何成员。

答案 2 :(得分:0)

Assembly myAssembly;
myAssembly = Assembly.LoadFrom(@"c:\xyz.dll");                       
Type myType = myAssembly.GetTypes()[0]; //change 0 according to your class type.
BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
MethodInfo myMethod = myType.GetMethod("Methodname", eFlags);                   
object obj1 = myAssembly.CreateInstance(myType.FullName);
object obj2 = myMethod.Invoke(obj1, new object[2] { parameters1, parameters1  });