С# Получить делегат от MethodInfo

У меня проблема с этим кодом:

public static Delegate[] ExtractMethods(object obj)
{
    Type type = obj.GetType();
    MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
    Delegate[] methodsDelegate = new Delegate[methods.Count()];

    for (int i = 0; i < methods.Count(); i++)
    {
        methodsDelegate[i] = Delegate.CreateDelegate(null, methods[i]);
    }
    return methodsDelegate;
}

at Delegate.CreateDelegate тип делегата самый гонимый но я вызываю этот метод для нескольких объектов. Как получить тип делегата?


person moien    schedule 14.10.2016    source источник


Ответы (2)


Это сработало для меня. [ https://stackoverflow.com/a/16364220/1559611]

    public static Delegate[] ExtractMethods(object obj)
    {
        Type type = obj.GetType();

        MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

        Delegate[] methodsDelegate = new Delegate[methods.Count()];

        for (int i = 0; i < methods.Count(); i++)
        {
            methodsDelegate[i] = CreateDelegate(obj , methods[i]);
        }

        return methodsDelegate;
    }

    public static Delegate CreateDelegate(object instance, MethodInfo method)
    {
        var parameters = method.GetParameters()
                   .Select(p => Expression.Parameter(p.ParameterType, p.Name))
                    .ToArray();

        var call = Expression.Call(Expression.Constant(instance), method, parameters);
        return Expression.Lambda(call, parameters).Compile();
    }
person moien    schedule 14.10.2016
comment
В тех же строках, что и эта: stackoverflow.com/a/16364220/1559611 - person Mrinal Kamboj; 14.10.2016

Используйте 1_

Type type = methods[0].DeclaringType;

вам придется быть немного осторожным, если вы используете наследование.

Также обратите внимание на MethodInfo.ReflectedType

person Miguel Sanchez    schedule 14.10.2016
comment
Я получаю сообщение об ошибке для обоих -> Тип должен быть производным от делегата. - person moien; 14.10.2016
comment
@moien, в какой строке вы получаете сообщение об ошибке, я проверил этот код, и он у меня работает - person Miguel Sanchez; 14.10.2016
comment
methodDelegate[i] = Delegate.CreateDelegate(методы[i].DeclaringType, методы[i]); - person moien; 14.10.2016
comment
в строке 7 методыDelegate[i] = Delegate.CreateDelegate(методы[i].DeclaringType, методы[i]); - person moien; 14.10.2016
comment
@Moien извините! ошибка типа, который вы передаете не типу класса, а типу делегата, вскоре обновит мой ответ - person Miguel Sanchez; 14.10.2016