2015-01-07 3 views
0

Я отлаживаю большое приложение, которое я не писал, которое работает в Windows, но зависает на Linux + MONO. Приложение состоит из ядра C#, который содержит класс ScriptCompiler, построенный на основе 700 строк, который компилирует скрипты C# во время выполнения.Получить тип родительского объекта метода invoked?

После компиляции всех «скриптов» ScriptCompiler просматривает все сборки и ищет методы Configure() для вызова. Один из этих методов настройки висит при запуске в системе Linux с использованием Mono. Вот соответствующий отрывок:

for (int i = 0; i < types.Length; ++i) 
    { 
     MethodInfo m = types[i].GetMethod(method, BindingFlags.Static | BindingFlags.Public); 

     if (m != null) 
     { 
      invoke.Add(m); 
     } 
    } 

последовало вскоре по

invoke.Sort(new CallPriorityComparer()); 

for (int i = 0; i < invoke.Count; ++i) 
{ 
    invoke[i].Invoke(null, null); 
} 

Это огромное приложение, так что я не могу просто пойти вносить изменения волей-неволей. То, что я хотел бы сделать, это вставить строку в этот цикл, который выплескивает имя (или тип, я думаю) объекта, метод Configure которого в настоящее время вызывается в stdout. Что-то вроде:

invoke[i].ParentObject.GetType(); 

(очевидно, это неверно, но мы надеемся, что это будет иметь смысл).

Возможно ли это?

ответ

2

Вы можете получить имя типа, в котором метод ссылается invoke[i] объявлен с:

invoke[i].DeclaringType.Name 

Вы можете войти на это, как вы считаете нужным.

Как отмечает CSharpie, это отличается от ReflectedType - если метод Configure является производным от базового класса, DeclaringType даст вам базовый класс, не обязательно фактический тип среды выполнения, что нашло свое отражение.

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

DeclaringType может быть несколько более полезным для вас, хотя, как она расскажет вам, где именно вы можете найти реализацию (например, если вы размышляете класс A : B но метод Configure реализован в B, DeclaringType будет B в то время как ReflectedType будет A).

+0

Отлично, спасибо. – nathanvy

2

Вы ищете ReflectedType -Property, если я не ошибаюсь. (Вы хотели Тип «ParentObject» и это я думаю, вы не все равно, если этот метод из производного BaseClass)

invoke[i].ReflectedType 

Как уже упоминалось, существует разница в DeclaringType хотя. это даст вам тип, который действительно реализует метод. Это может быть некоторый базовый класс. Поэтому не забудьте проверить, какой из них вам действительно нужен.

+0

Оказывается, в этом случае это дает ту же информацию, что и DeclaringType.Name, поэтому они оба работают. Конфигурация не должна быть реализована в производном классе. Огромное спасибо! – nathanvy