2010-09-13 109 views
1

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

  1. 我怎样才能做到这一点使用反射?
  2. 有没有另一种方法来实现这一目标?

这就是我想要做的事。我需要查看这些私有方法及其内容。我不想调用它们。

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)不工作。

+0

的可能重复[我如何使用反射调用在C#中的私有方法?(http://stackoverflow.com/questions/135443/how-do-i-use-reflection-to-invoke -a-private-method-in-c) – ChrisF 2010-09-13 12:22:19

+0

查看更新后的问题,这不是重复的 – Anshul 2010-09-13 12:39:24

+0

是你自己的程序集还是外部程序集?两个议会之间是否建立了充分的信任? – 2010-09-14 07:57:56

回答

3

使你试图使用一个第三方组件的私有方法的假设:

我敦促使用私有方法谨慎,他们已经进行了私人的原因,并 可能依赖有些状态,你将无法预料;此外,如果程序集将来会更新,私人行为可能会被更改或删除,导致您不得不重新编写代码以进行补偿。

但是,如果您想继续,有两种方法可供您使用。使用新的动态关键字在.NET 4 一种方法我们:

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

的BindingFlags

您必须指定实例或公共或非公开或不成员将一起返回静态

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 });