2010-09-13 107 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 });