2016-12-02 18 views
0

Я экспортирую метод с использованием MEF с атрибутом [Экспорт], и мне нужно использовать этот метод с помощью контейнера (получение метода с использованием GetExports). GetExports возвращает объект ExportedDelegate, о котором я не знаю, как извлечь MethodInfo из. Проверка с помощью отладчика Я рассматриваю его как частную собственность, и у меня возникает соблазн извлечь его с помощью отражения, но это не похоже на правильный способ сделать это.Как использовать метод, экспортируемый с помощью MEF программно?

Любые идеи?

Эта проблема отличается от this one. Я не пытаюсь использовать [Import], я должен получить и использовать метод из Контейнера.

+0

Возможный дубликат [Как экспортировать и импортировать функции и выполнить их с помощью MEF?] (Http://stackoverflow.com/questions/3814839/how-to-export-import-functions-and-execute-them-with -mef) – FCin

+0

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

+0

Почему? Вы не можете просто импортировать его. Что тебя останавливает? – FCin

ответ

0

Хорошо, ребята, так что это было сложно, но я оставляю здесь ссылку.

Все, что вам нужно сделать, это привести значение, возвращенное из MEF в ExportedDelegate и вызвать CreateDelegate правильный путь:

Это устанавливает Импорт мы хотим:

var importDefinition = new ImportDefinition(e => true, obj.GetType().FullName, ImportCardinality.ZeroOrMore, false, false); 

var objectsWithMethods = container.GetExports(importDefinition) 
       .Where(x => x.Value is IYourInterface) 
       .Select(x => x.Value) 
       .ToList();      

Это получает методы объекты, найденные выше (итерация objectsWithMethods в Еогеасп с использованием objectsWithMethod):

var endPointsImportDefinition = new ImportDefinition(e => true, objectsWithMethod.GetType().FullName, ImportCardinality.ZeroOrMore, false, false); 
var endPoints = container.GetExports(endPointsImportDefinition) 
         .Where(x => x.Value is ExportedDelegate) 
         .Select(x => x.Value) 
         .ToList(); 

И, наконец, чтобы получить MethodInfo (который позволяет запускать метамфетамин О.Д.) вы используете:

var endPointMethod = (endPoint as ExportedDelegate).CreateDelegate(typeof(Delegate)).GetMethodInfo(); 

Что также может быть:

var endPointMethod = (endPoint as ExportedDelegate).CreateDelegate(typeof(Delegate)).Method; 

Надеется, что это помогает любому!