Есть ли какая-либо абстракция в. NET, которая инкапсулирует экземпляр MethodInfo +? - PullRequest
0 голосов
/ 04 апреля 2020

Я играю с Reflection и хотел бы инкапсулировать вызов метода экземпляра.

Я всегда заканчиваю тем, что делаю что-то вроде этого:

methodInfo.Invoke(instance, parameters)

Интересно, есть ли любой способ инкапсулировать его во что-то вроде call.Invoke(parameters), где экземпляр неявный.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Вы можете создать делегата, который связывает экземпляр. Вы можете сделать это либо с помощью метода stati c Delegate.CreateInstance, либо с помощью метода MethodInfo.CrateInstance. Первый основан на том, что вы знаете, что экземпляр на самом деле является скрытым первым параметром метода, поэтому последний может быть немного более понятным.

    class Thing
    {
        int _Number;
        public Thing(int number) { _Number = number; }
        public int GetNumber() { return _Number; }
    }

    public static void Main()
    {
        Thing thingOne = new Thing(1);
        Thing thingTwo = new Thing(2);

        MethodInfo getter = typeof(Thing).GetMethod("GetNumber");
        Func<int> getOne = (Func<int>)Delegate.CreateDelegate(typeof(Func<int>), thingOne, getter);
        Func<int> getTwo = (Func<int>)getter.CreateDelegate(typeof(Func<int>), thingTwo);

        Console.WriteLine(getOne());
        Console.WriteLine(getTwo());
    }
0 голосов
/ 04 апреля 2020

Почему бы не просто так:

public class MethodInvoker
{
    private MethodInfo _method;
    private object _target;

    public MethodInvoker(MethodInfo method, object target)
    {
        _method = method;
        _target = target;
    }

    public object Invoke(params object[] parameters) => _method.Invoke(_target, parameters);
}

...


string s = "Hello";

var invoker = new MethodInvoker(s.GetType().GetMethod("Substring",new Type[] { typeof(int), typeof(int) }), s);

Console.WriteLine(invoker.Invoke(1,3));

Вы можете использовать обобщенные значения для обеспечения безопасности типа для целевого или возвращаемого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...