2012-05-09 4 views
1

Некоторые проблемы с .NET отражение здесь ...Проблемы с .NET отражение

У меня есть сценарий работы с отражением в .NET: У меня есть класс сказать, CLASSA, который наследует метод из другого класса ClassA_Base. Оба находятся в одной и той же сборке. Этот метод принимает параметр, интерфейс, IInterfaceA, который находится в другой сборке. Теперь, когда я загружаю ClassA, используя отражение с помощью метода LoadFrom, который принимает путь к .dll, я получаю исключение MissingMethodException, когда пытаюсь использовать этот метод, и он не появляется, когда я разбиваю строку в Visual Studio и просматриваю методы базового класса. Интересно, что базовый класс также обладает некоторыми свойствами, которые возвращают IInterfaceA, и они появляются! Мне интересно, в чем проблема?

ClassA : ClassA_Base 
{ 
} 

ClassA_Base 
{ 
    SomeMethod(IInterfaceA obj); //Doesn't show up 
    IInterfaceA SomeProperty{ get; } //Shows up 
} 

Это реализовано с использованием F #, но я считаю, что поведение будет таким же, как и с любой другой реализацией .NET.

Спасибо заранее ...

+0

Не могли бы вы показать нам свой код? – svick

ответ

0

Вместо умолчанию Type.GetMethod, передайте значение BindingFlags. Что-то вроде этого:

typeof(ClassA).GetMethod("SomeMethod", 
         BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, 
         null, 
         new Type[] { typeof(IInterfaceA) }, 
         null); 

Извините, я не знаю, как перевести его на F #.

+0

Фактически, я создаю экземпляр, сначала используя: assembly.CreateInstance (type.FullName, true, BindingFlags.Default, null, constructorparameters, null, null); Как настроить код для этого сценария? – Tolu

+0

Ну, вам нужно иметь объект 'Type' (я использовал' typeof', но вы, вероятно, будете использовать 'Assembly.GetType()'). Вы можете использовать метод GetMethod для получения метода, и я думаю, что вы вызываете 'Invoke' на методе для его выполнения. Вы должны передать экземпляр, который вы получили от CreateInstance, к методу 'Invoke'. –

+0

Упс. Извините, меня увлекла абстракция динамического вызова. Я делал вызов с помощью динамического метода. Благодарю. Я попробую это сейчас. Я изменю реализацию динамического метода F # и посмотрю, что получится. – Tolu

0

С отражением вы получаете только методы, реализованные в текущем классе. Это означает, что для вещей в базовых классах не отображаются. Если вы хотите найти метод, просто посмотрите его на базовый класс, вы можете затем вызвать его на дочернем элементе.

Причина, по которой проявляется интерфейс, заключается в том, что она все еще реализована на конкретном классе. (а не только на базе)

Смежные вопросы