【问题标题】:Create wrapper around interface and get method/paramters called围绕接口创建包装器并获取调用的方法/参数
【发布时间】:2020-07-13 12:19:07
【问题描述】:

假设我有这个界面

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

如何围绕它创建一个包装器对象?

然后捕获调用的方法或访问的参数和值等。

例如:

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

我如何能够使用反射或其他什么来了解以下内容:

正在调用的参数名称和正在设置的值

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

获取“GetMethod1”的方法名和参数,然后根据它返回一个值?

希望是有道理的

【问题讨论】:

  • 你想通过包装来达到什么目的?
  • 基本上。一个通用包装器,它接受你给它的任何接口。并使用正在访问的内容调用外部 API(尚未构建)。所以在上面的例子中,如果我调用 myWrapper.GetMethod1("Test")。然后我将传递以下数据:方法 - GetMethod1 参数 - “测试”。然后得到响应并返回这个
  • 如果调用 myWrapper.Property1 = 7。我想知道要传递给 API 的属性名称和值。
  • 您可以查看模板(或 .net 中的泛型类型)。
  • 我知道什么是泛型类型。但这不是我寻求帮助的目的。

标签: c# reflection interface


【解决方案1】:

好的,所以使用 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 上的任何操作都会调用拦截函数,在该函数中可以获取从被调用的方法名称到传递的参数的所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-22
    • 2021-03-26
    • 2018-04-12
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多