MethodInfo из ExpandoObject

Я знаю, что раньше его запрашивали для Reflection на ExpandoObjects здесь.

У меня вопрос немного другой. У меня есть статические и динамические функции, которые должны выполняться из некоторой функции, подобной object ExecuteFunction(string name, params object[] parameters).

Я выполняю статические функции через Reflection. Итак, вопрос в том, могу ли я повторно использовать вызов MethodInfo и получить объект MethodInfo из ExpandoObject? Или мне нужно реализовать 2 функции (одну с Action и одну с MethodInfo)?


person Dominik G    schedule 21.08.2012    source источник


Ответы (2)


Вы не получите MethodInfo для динамически определенных методов в ExpandoObject.
Динамически определенные методы аналогичны динамически определяемым свойствам, просто они относятся к типу делегата.

Однако этот тип делегата содержит свойство с именем Method типа MethodInfo, которое вы можете использовать:

object ExecuteFunction(IDictionary<string, object> obj, string name,
                       params object[] parameters)
{
    object property;
    if(!obj.TryGetValue(name, out property))
        return null;

    var del = property as Delegate;
    if(del == null)
        return null;

    var methodInfo = del.Method;

    // do with methodInfo what you need to do to invoke it.
    // This should be in its own method so you can call it from both versions of your
    // ExecuteFunction method.
}

Обратите внимание, что первый параметр имеет тип IDictionary<string, object>. ExpandoObject реализует этот интерфейс, и нам не нужны никакие другие функции из ExpandoObject, поэтому параметр - это просто тип реализованного интерфейса, функциональность которого нам нужна.

person Daniel Hilgarth    schedule 21.08.2012
comment
Поэтому мне пришлось бы использовать 2 функции ... одну с MethodInfo, а другую с Action или что-то подобное ... не так ли? - person Dominik G; 21.08.2012

Платформа с открытым исходным кодом ImpromptuInterface (доступная на nuget) обеспечивает легкий доступ к вызовам DLR, которые позволяют вызывать методы по строковому имени. Единственная загвоздка в том, что если метод возвращает void, вы должны использовать InvokeMemberAction, и если он возвращает значение, вы можете использовать InvokeMember. Это позволяет вызывать динамически определенные методы и вызывать статически определенные методы быстрее, чем отражение.

person jbtule    schedule 21.08.2012