2010-09-13 3 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

+0

см. обновленный вопрос, это не дубликат – Anshul

+0

у вас есть сборка или внешняя сборка? Достаточно ли доверия между двумя сборками? –

ответ

3

Делая предположение, что вы пытаетесь использовать частные методы узла 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

Вы должны указать Instance или Static наряду с общественной или непубличных или ни один из членов не будут возвращены.

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 }); 
Смежные вопросы