Получить приватные методы класса, используя отражение - PullRequest
1 голос
/ 13 сентября 2010

Я хочу получить частные (реализации и другие) методы класса, который реализует интерфейс, а также является производным (наследует) базового класса.

  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) не работает.

Ответы [ 3 ]

3 голосов
/ 13 сентября 2010

Предполагается, что вы пытаетесь использовать закрытые методы сторонней сборки:

Я призываю к осторожности при использовании частных методов, они были сделаны частными по причине и может полагаться на состояние, которого вы не сможете предвидеть; Кроме того, если сборка будет обновлена ​​в будущем, личное поведение может быть изменено или удалено, в результате чего вам придется переписать свой код для компенсации.

Однако, в вашем распоряжении есть два метода, если вы хотите продолжить. Один из способов использования нами нового динамического ключевого слова в .net 4:

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

Чтобы использовать рефлексию, вам может помочь этот вопрос:

Как использовать отражение для вызова частного метода?

Надеюсь, это поможет.

1 голос
/ 14 сентября 2010

BindingFlags

Вы должны указать Экземпляр или Статический вместе с Public или NonPublic, иначе члены не будут возвращены.

0 голосов
/ 28 декабря 2012
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  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...