Создайте обертку вокруг интерфейса и вызовите метод / параметры - PullRequest
0 голосов
/ 01 апреля 2020

Допустим, у меня есть этот интерфейс

public interface ITest
{
    int Property1 { get; set; }
    void Method1();
    string GetMethod1();
    void MethodWithParam(string str);
}

Как я могу создать объект-оболочку вокруг этого?

И затем захватить вызываемые методы или параметры и значения, к которым осуществляется доступ, et c.

Например:

var myWrapper = GetWrapper<ITest>();
myWrapper.Property1 = 7;

Как я могу использовать отражение или что-то еще, чтобы знать следующее:

Имя вызываемого параметра и устанавливаемое значение

var data = myWrapper.GetMethod1("Test");

Получить имя метода "GetMethod1" вместе с параметрами и затем вернуть значение, основанное на этом?

Надежда имеет смысл

1 Ответ

0 голосов
/ 01 апреля 2020

Хорошо, так что ответьте довольно просто, используя прокси-генератор Castle Core: https://github.com/castleproject/Core

public interface ITest
{
    int Property1 { get; set; }
    void Method1();
    string GetMethod1();
    void MethodWithParam(string str);
}

public static class Wrapper
{
    private class MethodInterceptor : IInterceptor
    {
        Action<IInvocation> OnIntercept;
        public MethodInterceptor(Action<IInvocation> OnIntercept)
        {
            this.OnIntercept = OnIntercept;
        }

        public void Intercept(IInvocation invocation)
        {
            OnIntercept?.Invoke(invocation);
        }
    }

    private static void CallAPI(IInvocation invocation)
    {
        var methodName = invocation.Method.Name;
        var valuespassed = invocation.Arguments;
        var retType = invocation.Method.ReturnType.FullName;

        //DO API THINGS NOW
    }

    public static T Get<T>()
    {
        ProxyGenerator generator = new ProxyGenerator();
        var interceptor = new MethodInterceptor(CallAPI);
        var c = generator.CreateInterfaceProxyWithoutTarget<ITest>(interceptor);
        return (T)c;
    }
}




public class Test123
{
    public void Test()
    {
        var c = Wrapper.Get<ITest>();
        c.Property1 = 7;
        var propval = c.Property1;
    }
}

Любое действие на c вызывает функцию перехвата, где можно получить все из имени метода, являющегося Вызванные аргументы переданы.

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